/ Hex Artifact Content
Login

Artifact 01ae58949a28edaecd5645abbe29ac9d2ee983fd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0860: 4e 54 48 52 45 53 48 4f 4c 44 0a 23 20 20 64 65  NTHRESHOLD.#  de
0870: 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 54 48  fine NTDDI_WINTH
0880: 52 45 53 48 4f 4c 44 20 20 20 20 20 20 20 20 20  RESHOLD         
0890: 20 20 20 20 20 20 20 30 78 30 36 30 34 30 30 30         0x0604000
08a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
08b0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
08c0: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78  the GetVersionEx
08d0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61  [AW] functions a
08e0: 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f 6e  re deprecated on
08f0: 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 73   the.** target s
0900: 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73 69  ystem.  GetVersi
0910: 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20 64  onEx was first d
0920: 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69 6e  eprecated in Win
0930: 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  8.1..*/.#ifndef 
0940: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0950: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0960: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0970: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0980: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0990: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
09a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69   0   /* GetVersi
09d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63  onEx() is deprec
09e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a  ated */.#  else.
09f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0a00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
0a10: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47  IONEX   1   /* G
0a20: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73  etVersionEx() is
0a30: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65   current */.#  e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0a50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0a60: 69 66 20 74 68 65 20 43 72 65 61 74 65 46 69 6c  if the CreateFil
0a70: 65 4d 61 70 70 69 6e 67 41 20 66 75 6e 63 74 69  eMappingA functi
0a80: 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  on is supported 
0a90: 6f 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  on the.** target
0aa0: 20 73 79 73 74 65 6d 2e 20 20 49 74 20 69 73 20   system.  It is 
0ab0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  unavailable when
0ac0: 20 75 73 69 6e 67 20 22 6d 69 6e 63 6f 72 65 2e   using "mincore.
0ad0: 6c 69 62 22 20 6f 6e 20 57 69 6e 31 30 2e 0a 2a  lib" on Win10..*
0ae0: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0af0: 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 31 30 2c   for Windows 10,
0b00: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 22   always assume "
0b10: 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20 69 73 20  mincore.lib" is 
0b20: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  in use..*/.#ifnd
0b30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0b40: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0b50: 47 41 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  GA.#  if defined
0b60: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20  (NTDDI_VERSION) 
0b70: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  && NTDDI_VERSION
0b80: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 54 48 52   >= NTDDI_WINTHR
0b90: 45 53 48 4f 4c 44 0a 23 20 20 20 20 64 65 66 69  ESHOLD.#    defi
0ba0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0bb0: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0bc0: 47 41 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  GA   0.#  else.#
0bd0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0be0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
0bf0: 4c 45 4d 41 50 50 49 4e 47 41 20 20 20 31 0a 23  LEMAPPINGA   1.#
0c00: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0c20: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ant should alrea
0c30: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69  dy be defined (i
0c40: 6e 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22  n the "WinDef.h"
0c50: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23   SDK file)..*/.#
0c60: 69 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a  ifndef MAX_PATH.
0c70: 23 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  #  define MAX_PA
0c80: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
0c90: 20 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65          (260).#e
0ca0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0cb0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0cc0: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0cd0: 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20  or Win32.  This 
0ce0: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0cf0: 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a  be.** MAX_PATH..
0d00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0d10: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d20: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0d30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d40: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28  X_PATH_CHARS   (
0d50: 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66  MAX_PATH).#endif
0d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e  ../*.** This con
0d70: 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72  stant should alr
0d80: 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20  eady be defined 
0d90: 28 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68  (in the "WinNT.h
0da0: 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a  " SDK file)..*/.
0db0: 23 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f  #ifndef UNICODE_
0dc0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0dd0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f  .#  define UNICO
0de0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0df0: 41 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29  ARS      (32767)
0e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0e10: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0e20: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0e30: 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68  ) for WinNT.  Th
0e40: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0e50: 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45  ly be.** UNICODE
0e60: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0e70: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  S..*/.#ifndef SQ
0e80: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0e90: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0ea0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  ine SQLITE_WINNT
0eb0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0ec0: 20 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e    (UNICODE_STRIN
0ed0: 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e  G_MAX_CHARS).#en
0ee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0ef0: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0f00: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0f10: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0f20: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0f30: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0f40: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0f50: 20 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61   4 bytes per cha
0f60: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
0f70: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
0f80: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
0f90: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
0fa0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0fb0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0fc0: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0fd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0fe0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0ff0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
1000: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
1010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1020: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
1030: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
1040: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
1050: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1060: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f  y be.** UNICODE_
1070: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
1080: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
1090: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10a0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
10b0: 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69  TH_BYTES.#  defi
10c0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ne SQLITE_WINNT_
10d0: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20  MAX_PATH_BYTES  
10e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1100: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20  sizeof(WCHAR) * 
1110: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
1120: 5f 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e  _PATH_CHARS).#en
1130: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
1140: 75 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  um error message
1150: 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72   length (in char
1160: 73 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f  s) for WinRT..*/
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
1190: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
11a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
11b0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28  X_ERRMSG_CHARS (
11c0: 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  1024).#endif../*
11d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
11e0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72  zero if the char
11f0: 61 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20  acter should be 
1200: 74 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72  treated as a dir
1210: 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61  ectory.** separa
1220: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
1230: 77 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64  winIsDirSep.#  d
1240: 65 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65  efine winIsDirSe
1250: 70 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  p(a)            
1260: 20 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27      (((a) == '/'
1270: 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c  ) || ((a) == '\\
1280: 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ')).#endif../*.*
1290: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  * This macro is 
12a0: 75 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61  used when a loca
12b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  l variable is se
12c0: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61  t to a value tha
12d0: 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d  t is.** [sometim
12e0: 65 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  es] not used by 
12f0: 74 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76  the code (e.g. v
1300: 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  ia conditional c
1310: 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a  ompilation)..*/.
1320: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56  #ifndef UNUSED_V
1330: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20  ARIABLE_VALUE.# 
1340: 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56   define UNUSED_V
1350: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29  ARIABLE_VALUE(x)
1360: 20 20 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a        (void)(x).
1370: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1380: 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61 63  turns the charac
1390: 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ter that should 
13a0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 64  be used as the d
13b0: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
13c0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77  or..*/.#ifndef w
13d0: 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20 64  inGetDirSep.#  d
13e0: 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53  efine winGetDirS
13f0: 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ep()            
1400: 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a      '\\'.#endif.
1410: 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65  ./*.** Do we nee
1420: 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65  d to manually de
1430: 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66  fine the Win32 f
1440: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73  ile mapping APIs
1450: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41   for use with WA
1460: 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d  L.** mode or mem
1470: 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
1480: 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49   (e.g. these API
1490: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
14a0: 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a  in the Windows.*
14b0: 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  * CE SDK; howeve
14c0: 72 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  r, they are not 
14d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68  present in the h
14e0: 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a  eader file)?.*/.
14f0: 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  #if SQLITE_WIN32
1500: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
1510: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
1520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1530: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
1540: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1550: 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66  >0)./*.** Two of
1560: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e   the file mappin
1570: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65  g APIs are diffe
1580: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54  rent under WinRT
1590: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
15a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65  ich.** set we ne
15b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
15c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41  E_OS_WINRT.WINBA
15d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
15e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
15f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e  ppingFromApp(HAN
1600: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
1610: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
1620: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  UTES, ULONG, ULO
1630: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a  NG64, LPCWSTR);.
1640: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
1650: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
1660: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48  wOfFileFromApp(H
1670: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c  ANDLE, ULONG, UL
1680: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a  ONG64, SIZE_T);.
1690: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
16a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
16b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45  AS_ANSI).WINBASE
16c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
16d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
16e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingA(HANDLE, LPS
16f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1700: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1710: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1720: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64  D, LPCSTR);.#end
1730: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1750: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  NSI) */..#if def
1760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1770: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42  2_HAS_WIDE).WINB
1780: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1790: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
17a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20  appingW(HANDLE, 
17b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
17c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
17d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
17e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a  WORD, LPCWSTR);.
17f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1800: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1810: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e  AS_WIDE) */..WIN
1820: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
1830: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
1840: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52  ile(HANDLE, DWOR
1850: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1860: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66   SIZE_T);.#endif
1870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1880: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NRT */../*.** Th
1890: 65 73 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ese file mapping
18a0: 20 41 50 49 73 20 61 72 65 20 63 6f 6d 6d 6f 6e   APIs are common
18b0: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
18c0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 0a 57 49  nd WinRT..*/..WI
18d0: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
18e0: 4e 41 50 49 20 46 6c 75 73 68 56 69 65 77 4f 66  NAPI FlushViewOf
18f0: 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c 20 53 49  File(LPCVOID, SI
1900: 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53 45 41 50  ZE_T);.WINBASEAP
1910: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
1920: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
1930: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1940: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1950: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 2a  ILEMAPPING_API *
1960: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
1970: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
1980: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
1990: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
19a0: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ef INVALID_FILE_
19b0: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66  ATTRIBUTES.# def
19c0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  ine INVALID_FILE
19d0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57  _ATTRIBUTES ((DW
19e0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
19f0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
1a00: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
1a10: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
1a20: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
1a30: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
1a40: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
1a50: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
1a60: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
1a70: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
1a80: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
1a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
1ab0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1ac0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
1ad0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64  for WAL */.typed
1ae0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
1af0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20   winShm;        
1b00: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69     /* A connecti
1b10: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1b20: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1b40: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f   winShmNode;   /
1b50: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68  * A region of sh
1b60: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23  ared-memory */.#
1b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
1b80: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
1b90: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
1ba0: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
1bb0: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
1bc0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
1bd0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
1be0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1bf0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75  NCE.typedef stru
1c00: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20  ct winceLock {. 
1c10: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20   int nReaders;  
1c20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c30: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f  f reader locks o
1c40: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1c50: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  L bPending;     
1c60: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1c70: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
1c80: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1c90: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76  /.  BOOL bReserv
1ca0: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  ed;     /* Indic
1cb0: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20  ates a reserved 
1cc0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1cd0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
1ce0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20   bExclusive;    
1cf0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20  /* Indicates an 
1d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68  exclusive lock h
1d10: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1d20: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b   */.} winceLock;
1d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d40: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63  he winFile struc
1d50: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61  ture is a subcla
1d60: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1d70: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20  le* specific to 
1d80: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72  the win32.** por
1d90: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a  tability layer..
1da0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1db0: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c  t winFile winFil
1dc0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c  e;.struct winFil
1dd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  e {.  const sqli
1de0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1df0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75  pMethod; /*** Mu
1e00: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f  st be first ***/
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e20: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68  pVfs;      /* Th
1e30: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70  e VFS used to op
1e40: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  en this file */.
1e50: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20    HANDLE h;     
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1e70: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1e80: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
1e90: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  u8 locktype;    
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
1eb0: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
1ec0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
1ed0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73  ile */.  short s
1ee0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20  haredLockByte;  
1ef0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f   /* Randomly cho
1f00: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73  sen byte used as
1f10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a   a shared lock *
1f20: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73  /.  u8 ctrlFlags
1f30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
1f40: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49  lags.  See WINFI
1f50: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  LE_* below */.  
1f60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1f80: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1f90: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1fa0: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rror */.#ifndef 
1fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1fc0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20    winShm *pShm; 
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1fe0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20  tance of shared 
1ff0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66  memory on this f
2000: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
2010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2020: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
2030: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
2040: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
2050: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
2060: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
2070: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
2080: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
2090: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
20a0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
20b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
20c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
20d0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
20e0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
20f0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
2100: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
2110: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
2120: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
2130: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ock */.  HANDLE 
2140: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
2150: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
2160: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
2170: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
2180: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
2190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
21a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
21b0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
21c0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
21d0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
21e0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
21f0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
2200: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
2210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2220: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2230: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
2240: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
2270: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
2280: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
22b0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
22c0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
22d0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22f0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
2300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2310: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
2320: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
2330: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2340: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2350: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
2360: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c  ctual; /* Actual
2370: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2380: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2390: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
23a0: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e  zeMax;    /* Con
23b0: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
23c0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23d0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
23e0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
23f0: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
2400: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
2410: 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  e WINFILE_RDONLY
2420: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 20 20            0x02  
2430: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
2440: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2450: 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50  define WINFILE_P
2460: 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30  ERSIST_WAL     0
2470: 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74  x04   /* Persist
2480: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2490: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
24a0: 50 53 4f 57 20 20 20 20 20 20 20 20 20 20 20 20  PSOW            
24b0: 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45  0x10   /* SQLITE
24c0: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
24d0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f  _OVERWRITE */../
24e0: 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *. * The size of
24f0: 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64   the buffer used
2500: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   by sqlite3_win3
2510: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e  2_write_debug().
2520: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2530: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
2540: 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  F_SIZE.#  define
2550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
2560: 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69  G_BUF_SIZE   ((i
2570: 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28  nt)(4096-sizeof(
2580: 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a  DWORD))).#endif.
2590: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
25a0: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
25b0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
25c0: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
25d0: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
25e0: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 73  data directory s
25f0: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2600: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2610: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
2620: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
2630: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2640: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
2650: 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65  TORY_TYPE (1).#e
2660: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2670: 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20  value used with 
2680: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
2690: 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f  t_directory() to
26a0: 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a   specify that. *
26b0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
26c0: 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20  irectory should 
26d0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a  be changed.. */.
26e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
26f0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
2700: 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69  ORY_TYPE.#  defi
2710: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2720: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
2730: 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a  YPE (2).#endif..
2740: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
2750: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
2760: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
2770: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
2780: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
2790: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
27a0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
27b0: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
27c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
27d0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f  _WIN32_MALLOC../
27e0: 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69 73 20  *. * If this is 
27f0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f  non-zero, an iso
2800: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2810: 62 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  be created by th
2820: 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20  e native Win32. 
2830: 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73  * allocator subs
2840: 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65  ystem; otherwise
2850: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72  , the default pr
2860: 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20  ocess heap will 
2870: 62 65 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20  be used.  This. 
2880: 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f  * setting has no
2890: 20 65 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d   effect when com
28a0: 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54  piling for WinRT
28b0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
28c0: 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20  his is enabled. 
28d0: 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65  * and an isolate
28e0: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
28f0: 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20  reated to store 
2900: 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61  all allocated da
2910: 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ta.. *. ********
2920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2960: 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e  ******. * WARNIN
2970: 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  G: It is importa
2980: 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20  nt to note that 
2990: 77 68 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e  when this settin
29a0: 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  g is non-zero an
29b0: 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  d the. *        
29c0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
29d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
29e0: 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65  led (e.g. by the
29f0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2a00: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20 66 75  n. *          fu
2a10: 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74  nction), all dat
2a20: 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63  a that was alloc
2a30: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ated using the i
2a40: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2a50: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20 62 65  l. *          be
2a60: 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65   freed immediate
2a70: 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d  ly and any attem
2a80: 70 74 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79  pt to access any
2a90: 20 6f 66 20 74 68 61 74 20 66 72 65 65 64 0a 20   of that freed. 
2aa0: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
2ab0: 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74  will almost cert
2ac0: 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ainly result in 
2ad0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63  an immediate acc
2ae0: 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20  ess violation.. 
2af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2b40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2b60: 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ATE.#  define SQ
2b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2b80: 43 52 45 41 54 45 20 20 20 20 28 54 52 55 45 29  CREATE    (TRUE)
2b90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2ba0: 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a  his is cache siz
2bb0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61  e used in the ca
2bc0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  lculation of the
2bd0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
2be0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70   the. * Win32-sp
2bf0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74  ecific heap.  It
2c00: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74   cannot be negat
2c10: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ive.. */.#ifndef
2c20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41   SQLITE_WIN32_CA
2c30: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53  CHE_SIZE.#  if S
2c40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
2c50: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20  CHE_SIZE>=0.#   
2c60: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2c70: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
2c80: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2c90: 43 41 43 48 45 5f 53 49 5a 45 29 0a 23 20 20 65  CACHE_SIZE).#  e
2ca0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
2cb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43  SQLITE_WIN32_CAC
2cc0: 48 45 5f 53 49 5a 45 20 28 2d 28 53 51 4c 49 54  HE_SIZE (-(SQLIT
2cd0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
2ce0: 53 49 5a 45 29 29 0a 23 20 20 65 6e 64 69 66 0a  SIZE)).#  endif.
2cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2d00: 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f  e initial size o
2d10: 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63  f the Win32-spec
2d20: 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73  ific heap.  This
2d30: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
2d40: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
2d50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2d60: 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64  P_INIT_SIZE.#  d
2d70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2d80: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
2d90: 45 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  E ((SQLITE_WIN32
2da0: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
2db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2de0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2df0: 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65  E) + 4194304).#e
2e00: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2e10: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
2e20: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
2e30: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
2e40: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
2e50: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2e60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2e70: 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  MAX_SIZE.#  defi
2e80: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2e90: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28  HEAP_MAX_SIZE  (
2ea0: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  0).#endif../*. *
2eb0: 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73   The extra flags
2ec0: 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73   to use in calls
2ed0: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65   to the Win32 he
2ee0: 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76  ap APIs.  This v
2ef0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a  alue may be. * z
2f00: 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61  ero for the defa
2f10: 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a  ult behavior.. *
2f20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2f40: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
2f50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
2f60: 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64  AGS     (0).#end
2f70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  if.../*.** The w
2f80: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
2f90: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
2fa0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
2fb0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
2fc0: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
2fd0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
2fe0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
2ff0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
3000: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
3010: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
3020: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
3030: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
3040: 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69  agic1;   /* Magi
3050: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
3060: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
3070: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
3080: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
3090: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
30a0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
30b0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
30c0: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
30d0: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
30e0: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
30f0: 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66  own)? */.#ifndef
3100: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
3110: 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63  gic2;   /* Magic
3120: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
3130: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
3140: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
3150: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
3160: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
3170: 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30  MEM_MAGIC1     0
3180: 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e  x42b2830b.#defin
3190: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  e WINMEM_MAGIC2 
31a0: 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 23      0xbd4d7cf4.#
31b0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
31c0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
31d0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
31e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
31f0: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c    WINMEM_MAGIC1,
3200: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
3210: 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44  FALSE.#ifndef ND
3220: 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d  EBUG.  ,WINMEM_M
3230: 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a  AGIC2.#endif.};.
3240: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3250: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
3260: 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 73  sertMagic1() ass
3270: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
3280: 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  a.magic1==WINMEM
3290: 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e  _MAGIC1 ).#defin
32a0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
32b0: 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 77  gic2() assert( w
32c0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
32d0: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
32e0: 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  2 ).#define winM
32f0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
3300: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
3310: 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73  ic1(); winMemAss
3320: 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c  ertMagic2();.#el
3330: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
3340: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
3350: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
3360: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
3370: 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  )  &win_mem_data
3380: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
3390: 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 6e  etHeap()     win
33a0: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
33b0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
33c0: 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f  tOwned()    win_
33d0: 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a  mem_data.bOwned.
33e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
33f0: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
3400: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
3410: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
3420: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
3430: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
3440: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
3450: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
3460: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
3470: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
3480: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
3490: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
34a0: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
34b0: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
34c0: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
34d0: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
34e0: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
34f0: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
3500: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3510: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
3520: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
3530: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
3540: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
3550: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3560: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
3570: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
3580: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
3590: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
35a0: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
35b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
35c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
35d0: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
35e0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
35f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3600: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
3610: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
3620: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
3630: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
3640: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
3650: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
3660: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
3670: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
3680: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
3690: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
36a0: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
36b0: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
36c0: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
36d0: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
36e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e   SQLITE_TEST.LON
36f0: 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56  G SQLITE_WIN32_V
3700: 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f  OLATILE sqlite3_
3710: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
3720: 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53  se.static LONG S
3730: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
3740: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
3750: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
3760: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
3770: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
3780: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
3790: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
37a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
37c0: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
37d0: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
37e0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
37f0: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
3800: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
3810: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
3820: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
3830: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
3840: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
3850: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
3860: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
3870: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
3880: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
3890: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
38a0: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
38b0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
38c0: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
38d0: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
38e0: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
38f0: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
3900: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
3910: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
3920: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
3930: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
3940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
3950: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
3960: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3980: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3990: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
39a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
39b0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
39c0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
39d0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
39e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
39f0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3a00: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3a10: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3a20: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
3a30: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3a40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
3a50: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
3a60: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
3a70: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
3a80: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
3a90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3aa0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
3ab0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
3ac0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ae0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3af0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3b00: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
3b10: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
3b20: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
3b30: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
3b40: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
3b50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3b60: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3b70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3b80: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
3b90: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
3ba0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3bb0: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
3bc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3bd0: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
3be0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3bf0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3c20: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
3c30: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
3c40: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
3c50: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3c60: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3c70: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3c90: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3ca0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3cc0: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3ce0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3cf0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
3d00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3d10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3d20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3d30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3d40: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
3d50: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
3d60: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
3d70: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3d80: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3da0: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
3db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3dc0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
3dd0: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
3de0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3df0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
3e00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3e10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3e20: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3e30: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
3e40: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3e50: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3e70: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3e80: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
3e90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ea0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3eb0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ec0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3ed0: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
3ee0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3ef0: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
3f00: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
3f10: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3f20: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
3f30: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
3f40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3f50: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3f60: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3f70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3f80: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
3f90: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3fa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3fb0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3fc0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3fd0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
3fe0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3ff0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4020: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
4030: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
4040: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
4050: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4060: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
4070: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
4080: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
4090: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
40a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
40b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
40c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
40d0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
40e0: 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69  \.        (!defi
40f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4100: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4110: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20  AX_MMAP_SIZE>0) 
4120: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
4130: 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45  ITE_WIN32_CREATE
4140: 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b  FILEMAPPINGA.  {
4150: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
4160: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
4170: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
4180: 61 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20  appingA,      0 
4190: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
41a0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
41b0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
41c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41f0: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
4200: 6e 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngA ((HANDLE(WIN
4210: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
4220: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
4230: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
4240: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4250: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4260: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [6].pCurrent)..#
4270: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4280: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
4290: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
42a0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
42b0: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
42c0: 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65 64         (!defined
42d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
42e0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
42f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20  MMAP_SIZE>0)).  
4300: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
4310: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
4320: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
4330: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
4340: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
4350: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4360: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4370: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4380: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4390: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
43a0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
43b0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
43c0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
43d0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
43e0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
43f0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4400: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
4410: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
4420: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4430: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4450: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
4460: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
4470: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4480: 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20  CreateMutexW,   
4490: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
44a0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  lse.  { "CreateM
44b0: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
44c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
44f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
4500: 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c  teMutexW ((HANDL
4510: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
4520: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
4530: 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20  ,BOOL, \.       
4540: 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61   LPCWSTR))aSysca
4550: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
4560: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4580: 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  SI).  { "DeleteF
4590: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
45a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
45b0: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
45c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
45d0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
45e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
45f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4620: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4630: 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leA ((BOOL(WINAP
4640: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4650: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
4660: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4670: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4680: 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74  WIDE).  { "Delet
4690: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
46a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
46b0: 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  leteFileW,      
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46d0: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
46e0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
46f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4720: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
4730: 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  FileW ((BOOL(WIN
4740: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4750: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
4760: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
4770: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
4780: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
4790: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
47a0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
47b0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
47c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
47d0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
47e0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
47f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4800: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4810: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
4820: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
4830: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
4840: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
4850: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
4860: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
4870: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
4880: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4890: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
48a0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
48b0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
48c0: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
48d0: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
48e0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
48f0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
4900: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4930: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
4940: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
4950: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
4960: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
4970: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
4980: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
4990: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
49a0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
49b0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
49c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
49d0: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
49e0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
49f0: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
4a00: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
4a10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
4a20: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
4a30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4a40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4a50: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
4a60: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
4a70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a80: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
4a90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4aa0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
4ab0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
4ac0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4af0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
4b00: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
4b10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
4b20: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
4b30: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
4b40: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
4b50: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
4b60: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
4b70: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4b80: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4b90: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
4ba0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
4bb0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4bc0: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
4bd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4be0: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4bf0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
4c00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4c30: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
4c40: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
4c50: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
4c60: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
4c70: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
4c80: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
4c90: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  *))aSyscall[15].
4ca0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4cb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4cc0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4cd0: 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  ON).  { "FreeLib
4ce0: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4cf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65     (SYSCALL)Free
4d00: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20  Library,        
4d10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4d20: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4d30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4d40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4d70: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
4d80: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
4d90: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
4da0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
4db0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
4dc0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
4dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4de0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4df0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4e00: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
4e10: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
4e20: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
4e30: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
4e40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
4e60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4e70: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4e80: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
4e90: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
4ea0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
4eb0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
4ec0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4ed0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ee0: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4ef0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4f20: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4f30: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
4f40: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
4f50: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
4f60: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4f70: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4f80: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
4f90: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4fa0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4fb0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4fd0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4fe0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ff0: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
5000: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
5010: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
5020: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5030: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
5040: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5050: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5060: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5070: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5080: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
5090: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
50a0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
50b0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
50c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
50d0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
50e0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
50f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5100: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5110: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
5120: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
5130: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
5140: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
5150: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5160: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
5170: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
5180: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
51a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
51b0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
51c0: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
51d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
51e0: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
51f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5200: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5210: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5220: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5230: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5240: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
5250: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
5260: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
5270: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5280: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5290: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
52a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
52c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
52d0: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
52e0: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
52f0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
5300: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
5310: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5320: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5330: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
5340: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5350: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
5360: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
5370: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
5380: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5390: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
53a0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
53b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
53c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
53d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
53e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
53f0: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
5400: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
5410: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
5420: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
5430: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
5440: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
5450: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5460: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
5470: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
5480: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
5490: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
54a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
54b0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
54c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
54d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5500: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
5510: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
5520: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
5530: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
5540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5550: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5560: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
5570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5580: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
5590: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
55a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
55b0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
55c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
55d0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
55e0: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
55f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5620: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
5630: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
5640: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
5650: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
5660: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
5670: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
5680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5690: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
56a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
56b0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
56c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
56d0: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
56e0: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
56f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
5700: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
5710: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5720: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
5730: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
5740: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5770: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
5780: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
5790: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
57a0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
57b0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
57c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70  ))aSyscall[25].p
57d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
57e0: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
57f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5800: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
5810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5820: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
5830: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
5840: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5850: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
5860: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
5870: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5880: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5890: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
58a0: 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
58b0: 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
58c0: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
58d0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
58e0: 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22  ows CE. */.  { "
58f0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
5900: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
5910: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
5920: 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  sA,         0 },
5930: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
5940: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c  other Windows pl
5950: 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
5960: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
5970: 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
5980: 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61  ANSI string rega
5990: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
59a0: 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
59b0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
59c0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
59d0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
59e0: 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20  cAddress,       
59f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
5a00: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f  else.  { "GetPro
5a10: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5a20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5a50: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5a60: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
5a70: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
5a80: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
5a90: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
5aa0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
5ab0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5ac0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
5ad0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
5ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5af0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  GetSystemInfo,  
5b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b10: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
5b20: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
5b30: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5b60: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5b70: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
5b80: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
5b90: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
5ba0: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
5bb0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5bc0: 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ime",           
5bd0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
5be0: 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  emTime,         
5bf0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5c00: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20  osGetSystemTime 
5c10: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
5c20: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
5c30: 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72  yscall[29].pCurr
5c40: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5c50: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5c60: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5c70: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
5c80: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
5c90: 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  AsFileTime, 0 },
5ca0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
5cb0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5cc0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
5cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5ce0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5cf0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5d00: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5d10: 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  leTime ((VOID(WI
5d20: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5d30: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
5d40: 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72  yscall[30].pCurr
5d50: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5d60: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5d70: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
5d80: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
5d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5da0: 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20  )GetTempPathA,  
5db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5dc0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
5dd0: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5de0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5e10: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5e20: 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52  TempPathA ((DWOR
5e30: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5e40: 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c  ,LPSTR))aSyscall
5e50: 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [31].pCurrent)..
5e60: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5e70: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
5e80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5e90: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54  _WIDE).  { "GetT
5ea0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
5eb0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5ec0: 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20  etTempPathW,    
5ed0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5ee0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
5ef0: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5f00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5f40: 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28  mpPathW ((DWORD(
5f50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5f60: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
5f70: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
5f80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5f90: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
5fa0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
5fb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5fc0: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
5fd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5fe0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5ff0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
6000: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6030: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
6040: 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ount ((DWORD(WIN
6050: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
6060: 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e  call[33].pCurren
6070: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6080: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6090: 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45  _ANSI) && SQLITE
60a0: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
60b0: 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73  NEX.  { "GetVers
60c0: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
60d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56     (SYSCALL)GetV
60e0: 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20  ersionExA,      
60f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6100: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
6110: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
6120: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6150: 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69  efine osGetVersi
6160: 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e  onExA ((BOOL(WIN
6170: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6180: 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f   LPOSVERSIONINFO
6190: 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e  A))aSyscall[34].
61a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
61b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
61c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
61d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
61e0: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53  ) && \.        S
61f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
6200: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
6210: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
6220: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6230: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
6240: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6250: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
6260: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
6270: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
62a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
62b0: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
62c0: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
62d0: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
62e0: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
62f0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
6300: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
6330: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
6340: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6350: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
6360: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6370: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
6380: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6390: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
63a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
63b0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
63c0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
63d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
63e0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
63f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6400: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6410: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6420: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6450: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6460: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
6470: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
6480: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
6490: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
64a0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
64b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
64c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
64d0: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
64e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
64f0: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6500: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6510: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6520: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6530: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6560: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6570: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
6580: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
6590: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
65a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
65b0: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
65c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
65d0: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
65e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
65f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6600: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6610: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6620: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6630: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
6640: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
6650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6660: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
6670: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6680: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6690: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
66a0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
66b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
66c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
66d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
66e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
66f0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6710: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6730: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6740: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
6750: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6760: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6770: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6780: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
6790: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
67a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
67b0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
67d0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
67f0: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6800: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6810: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6840: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
6850: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
6860: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6870: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6880: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
6890: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
68c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
68d0: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
68e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
68f0: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6910: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6920: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6960: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6970: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
6980: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6990: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
69a0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
69b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
69c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
69d0: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
69e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
69f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6a00: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6a10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a20: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6a50: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
6a60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6aa0: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
6ab0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6ac0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
6ad0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
6ae0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6af0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6b00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6b10: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6b20: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6b30: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6b40: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6b50: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6b70: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
6b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6b90: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6ba0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
6bb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6be0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6bf0: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6c00: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6c10: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6c20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6c30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6c40: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
6c50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6c60: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
6c70: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
6c80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6c90: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6cb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6cd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6ce0: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
6cf0: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6d00: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6d10: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6d20: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6d30: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6d50: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6d60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6d70: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6da0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6de0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6df0: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6e00: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6e10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6e20: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6e30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6e40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6e50: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6e60: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6e70: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6e80: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6e90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ea0: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6eb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ec0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6ed0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6ee0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6f10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6f20: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6f30: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6f40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6f60: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6f70: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6f80: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6f90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6fa0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6fb0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6fc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6fd0: 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66   \.        (!def
6fe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ff0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7000: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
7010: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7020: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7030: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7040: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7050: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7060: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7070: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
7080: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
70a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
70b0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
70c0: 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  ile ((LPVOID(WIN
70d0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
70e0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
70f0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
7100: 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70  ))aSyscall[49].p
7110: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d  Current)..  { "M
7120: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
7130: 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ar",     (SYSCAL
7140: 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  L)MultiByteToWid
7150: 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a  eChar,     0 },.
7160: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69  .#define osMulti
7170: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28  ByteToWideChar (
7180: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
7190: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c  NT,DWORD,LPCSTR,
71a0: 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  int,LPWSTR, \.  
71b0: 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63        int))aSysc
71c0: 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74  all[50].pCurrent
71d0: 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72  )..  { "QueryPer
71e0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22  formanceCounter"
71f0: 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79  , (SYSCALL)Query
7200: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
7210: 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e  er, 0 },..#defin
7220: 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d  e osQueryPerform
7230: 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f  anceCounter ((BO
7240: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
7250: 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54         LARGE_INT
7260: 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  EGER*))aSyscall[
7270: 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  51].pCurrent).. 
7280: 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20   { "ReadFile",  
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
72a0: 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c  YSCALL)ReadFile,
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
72d0: 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ReadFile ((BOOL(
72e0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
72f0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  LPVOID,DWORD,LPD
7300: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7310: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7320: 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72  yscall[52].pCurr
7330: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e  ent)..  { "SetEn
7340: 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  dOfFile",       
7350: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7360: 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20  tEndOfFile,     
7370: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7380: 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46  fine osSetEndOfF
7390: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
73a0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
73b0: 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e  call[53].pCurren
73c0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
73d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
73e0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
73f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7400: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c  )SetFilePointer,
7410: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7420: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7430: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
7440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7470: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7480: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
7490: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
74a0: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
74b0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
74c0: 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43  )aSyscall[54].pC
74d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
74e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
74f0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7510: 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20  SCALL)Sleep,    
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7530: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
7540: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
7550: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7560: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7570: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7580: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7590: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
75a0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
75b0: 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72  Syscall[55].pCur
75c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
75d0: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
75e0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
75f0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7600: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
7610: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
7620: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
7630: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
7640: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
7650: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
7660: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
7670: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
7680: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7690: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
76a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f  _WINRT.  { "Unlo
76b0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
76c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
76d0: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
76e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
76f0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7700: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7710: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7740: 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63  .#ifndef osUnloc
7750: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
7760: 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  UnlockFile ((BOO
7770: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7780: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
7790: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
77a0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
77b0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
77c0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
77d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
77e0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
77f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7800: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
7810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7820: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
7830: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
7840: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7870: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
7880: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
7890: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
78a0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
78b0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
78c0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
78d0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
78e0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
78f0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66  OS_WINCE || !def
7900: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7910: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7920: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
7930: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7940: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7950: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7960: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7970: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7980: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
7990: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
79a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
79c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
79d0: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
79e0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
79f0: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
7a00: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
7a10: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
7a20: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
7a30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7a40: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7a50: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7a60: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7a70: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
7a80: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
7a90: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
7aa0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
7ab0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
7ac0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
7ad0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7ae0: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
7af0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7b00: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7b20: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
7b30: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7b40: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7b50: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7b60: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7b70: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7b80: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
7b90: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7ba0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7bb0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7bc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7bd0: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
7be0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7bf0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7c00: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
7c10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7c40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7c50: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7c60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7c70: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
7c80: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
7c90: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
7ca0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
7cb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7cc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7cd0: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7ce0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7cf0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7d00: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
7d10: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7d20: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7d30: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7d40: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7d60: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7d70: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7d80: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
7d90: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7da0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7db0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
7dc0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7dd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
7de0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7df0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7e00: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
7e10: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20  ingleObjectEx,  
7e20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7e30: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7e40: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
7e50: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7e70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7e80: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
7e90: 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52  eObjectEx ((DWOR
7ea0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7eb0: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
7ec0: 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c     BOOL))aSyscal
7ed0: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
7ee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7ef0: 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c  INRT.  { "SetFil
7f00: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
7f20: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20  FilePointerEx,  
7f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7f40: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7f50: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
7f60: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7f90: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
7fa0: 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c  PointerEx ((BOOL
7fb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7fc0: 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20  ,LARGE_INTEGER, 
7fd0: 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45  \.        PLARGE
7fe0: 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29  _INTEGER,DWORD))
7ff0: 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75  aSyscall[65].pCu
8000: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8010: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8020: 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  "GetFileInformat
8030: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20  ionByHandleEx", 
8040: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
8050: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
8060: 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73  dleEx, 0 },.#els
8070: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e  e.  { "GetFileIn
8080: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8090: 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  eEx", (SYSCALL)0
80a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
80c0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
80d0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
80e0: 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  ndleEx ((BOOL(WI
80f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
8100: 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e  .        FILE_IN
8110: 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41  FO_BY_HANDLE_CLA
8120: 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29  SS,LPVOID,DWORD)
8130: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
8140: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8150: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8160: 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  (!defined(SQLITE
8170: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
8180: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
8190: 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56 69  ZE>0).  { "MapVi
81a0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
81b0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
81c0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
81d0: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
81e0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
81f0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
8200: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8230: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
8240: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
8250: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
8260: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
8270: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
8280: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
8290: 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[67].pCurrent).
82a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
82b0: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
82c0: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
82d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
82e0: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
82f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8300: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
8310: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
8320: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8350: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
8360: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
8370: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
8380: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
8390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
83a0: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
83b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
83c0: 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72  Syscall[68].pCur
83d0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
83e0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
83f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8400: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
8410: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  N).  { "LoadPack
8420: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
8430: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
8440: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
8450: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8460: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
8470: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
8480: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
84b0: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
84c0: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
84d0: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
84e0: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
84f0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
8500: 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [69].pCurrent)..
8510: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8520: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
8530: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
8540: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
8550: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
8560: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8570: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
8580: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
8590: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
85c0: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
85d0: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
85e0: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
85f0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70  ))aSyscall[70].p
8600: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
8610: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
8620: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
8630: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
8640: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
8650: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
8660: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8670: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8680: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
8690: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
86a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
86b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
86c0: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
86d0: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
86e0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
86f0: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
8700: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
8710: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
8720: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8730: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
8740: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8750: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8760: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
8770: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
8780: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
8790: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
87a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
87b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
87c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
87d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
87e0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
87f0: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
8800: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
8810: 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[72].pCurrent)
8820: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
8830: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
8840: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
8850: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8860: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
8870: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
8880: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8890: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
88a0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
88b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
88e0: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
88f0: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
8900: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
8910: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33  STR))aSyscall[73
8920: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
8930: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
8940: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8950: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
8960: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
8970: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
8980: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
8990: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
89a0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34  OID))aSyscall[74
89b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
89c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
89d0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
89e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
89f0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
8a00: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43  P_SIZE>0).  { "C
8a10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8a20: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
8a30: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
8a40: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
8a50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
8a60: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8a70: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8a80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8a90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8aa0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8ab0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8ac0: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
8ad0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
8ae0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
8af0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
8b00: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
8b10: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
8b20: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
8b30: 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e  ../*.** NOTE: On
8b40: 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f   some sub-platfo
8b50: 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f  rms, the Interlo
8b60: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8b70: 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a  nge "function".*
8b80: 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c  *       is reall
8b90: 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74  y just a macro t
8ba0: 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69  hat uses a compi
8bb0: 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65  ler intrinsic (e
8bc0: 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20  .g. x64)..**    
8bd0: 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79     So do not try
8be0: 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73   to make this is
8bf0: 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61   into a redefina
8c00: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ble interface..*
8c10: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e  /.#if defined(In
8c20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8c30: 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49  Exchange).  { "I
8c40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8c50: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8c80: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8c90: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8ca0: 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65  hange Interlocke
8cb0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8cc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65  .#else.  { "Inte
8cd0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8ce0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
8cf0: 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  L)InterlockedCom
8d00: 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20  pareExchange, 0 
8d10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8d20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8d30: 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28  Exchange ((LONG(
8d40: 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a  WINAPI*)(LONG \.
8d50: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
8d60: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20  IN32_VOLATILE*, 
8d70: 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63  LONG,LONG))aSysc
8d80: 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74  all[76].pCurrent
8d90: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ).#endif /* defi
8da0: 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43  ned(InterlockedC
8db0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 20  ompareExchange) 
8dc0: 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
8dd0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
8de0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8df0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
8e00: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43  _UUID.  { "UuidC
8e10: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
8e20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
8e30: 75 69 64 43 72 65 61 74 65 2c 20 20 20 20 20 20  uidCreate,      
8e40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
8e50: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  e.  { "UuidCreat
8e60: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
8e70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8ea0: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72  #define osUuidCr
8eb0: 65 61 74 65 20 28 28 52 50 43 5f 53 54 41 54 55  eate ((RPC_STATU
8ec0: 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55  S(RPC_ENTRY*)(UU
8ed0: 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 37  ID*))aSyscall[77
8ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8ef0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
8f00: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
8f10: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
8f20: 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20  WIN32_USE_UUID. 
8f30: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65   { "UuidCreateSe
8f40: 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28  quential",     (
8f50: 53 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61  SYSCALL)UuidCrea
8f60: 74 65 53 65 71 75 65 6e 74 69 61 6c 2c 20 20 20  teSequential,   
8f70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8f80: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
8f90: 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53 43  tial",     (SYSC
8fa0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8fc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8fd0: 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
8fe0: 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20 20  uential \.      
8ff0: 20 20 28 28 52 50 43 5f 53 54 41 54 55 53 28 52    ((RPC_STATUS(R
9000: 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a  PC_ENTRY*)(UUID*
9010: 29 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70  ))aSyscall[78].p
9020: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
9030: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
9040: 5f 53 59 4e 43 29 20 26 26 20 53 51 4c 49 54 45  _SYNC) && SQLITE
9050: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
9060: 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f  .  { "FlushViewO
9070: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
9080: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 56   (SYSCALL)FlushV
9090: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
90a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
90b0: 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c   "FlushViewOfFil
90c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  e",          (SY
90d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
90f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
9100: 6e 65 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66  ne osFlushViewOf
9110: 46 69 6c 65 20 5c 0a 20 20 20 20 20 20 20 20 28  File \.        (
9120: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
9130: 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61  PCVOID,SIZE_T))a
9140: 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72  Syscall[79].pCur
9150: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
9160: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
9170: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
9180: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
9190: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
91a0: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
91b0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
91c0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
91d0: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
91e0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
91f0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
9200: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
9210: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
9220: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
9230: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
9240: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
9250: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
9260: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
9270: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
9280: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
9290: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
92a0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
92c0: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
92d0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
92e0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
92f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
9300: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
9310: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
9320: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
9330: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
9340: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
9350: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
9360: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9370: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
9380: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
9390: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
93a0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
93b0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
93c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
93d0: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
93e0: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
93f0: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
9400: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
9410: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
9420: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
9430: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
9440: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
9450: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
9460: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
9470: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
9480: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
9490: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
94a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
94b0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
94c0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
94d0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
94e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
94f0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
9500: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
9510: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
9520: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
9530: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
9540: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9550: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9560: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
9570: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
9580: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9590: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
95a0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
95b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
95c0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
95d0: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
95e0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
95f0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
9600: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9610: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
9620: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9630: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
9640: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
9650: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
9660: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
9670: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
9680: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
9690: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
96a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
96b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
96c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
96d0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
96e0: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
96f0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
9700: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
9710: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
9720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
9730: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
9740: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
9750: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
9760: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
9770: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
9780: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
9790: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
97a0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
97b0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
97c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
97d0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
97e0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
97f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9800: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
9810: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
9820: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9830: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9840: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
9850: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9860: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9870: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
9880: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
9890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
98a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
98b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
98c0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
98d0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
98e0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
98f0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9900: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9910: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9920: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9930: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9940: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9950: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
9960: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
9970: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9980: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
99a0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
99b0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
99c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
99d0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
99e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
99f0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9a00: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9a10: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9a20: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9a30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9a40: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9a50: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9a60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9a70: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9a80: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9a90: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
9aa0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
9ab0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9ac0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9ad0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9ae0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9af0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9b00: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9b10: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9b20: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9b30: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9b40: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9b50: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
9b60: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
9b70: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9b80: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9b90: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
9ba0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
9bb0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9bc0: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9bd0: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9be0: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9bf0: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9c00: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9c10: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
9c20: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
9c30: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
9c40: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
9c50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
9c60: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
9c70: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9c80: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
9c90: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
9ca0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
9cb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9cc0: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9cd0: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9ce0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9cf0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9d00: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9d10: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9d20: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9d30: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9d40: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9d50: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9d60: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9d80: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9d90: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9da0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9db0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9dc0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9dd0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9df0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9e00: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9e10: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
9e20: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
9e30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9e40: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
9e50: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
9e60: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9e70: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
9e80: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
9e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9ea0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9eb0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9ec0: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9ed0: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9f00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9f10: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
9f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9f30: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9f40: 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20  _ERROR, "failed 
9f50: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
9f60: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
9f90: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
9fa0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
9fb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9fc0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71  }.  }.#else.  sq
9fd0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9fe0: 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c  _NOTFOUND, "fail
9ff0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
a000: 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  t, heap=%p",.   
a010: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
a020: 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d  *)hHeap);.  rc =
a030: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
a040: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
a050: 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61  nLargest ) *pnLa
a060: 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74  rgest = nLargest
a070: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  ../*.** If a Win
a090: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
a0a0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a0b0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
a0c0: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
a0d0: 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64  o.** destroy and
a0e0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20 49   recreate it.  I
a0f0: 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  f the Win32 nati
a100: 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69  ve heap is not i
a110: 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a  solated and/or.*
a120: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65  * the sqlite3_me
a130: 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63  mory_used() func
a140: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
a150: 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54  turn zero, SQLIT
a160: 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62  E_BUSY will.** b
a170: 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  e returned and n
a180: 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  o changes will b
a190: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69  e made to the Wi
a1a0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e  n32 native heap.
a1b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a1c0: 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70  win32_reset_heap
a1d0: 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  (){.  int rc;.  
a1e0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
a1f0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
a200: 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61  ter; ) /* The ma
a210: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
a220: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
a230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
a240: 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54  *pMem; )    /* T
a250: 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63  he memsys static
a260: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a270: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
a280: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
a290: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
a2a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
a2b0: 52 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f  R); ).  MUTEX_LO
a2c0: 47 49 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69  GIC( pMem = sqli
a2d0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
a2e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
a2f0: 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71  TIC_MEM); ).  sq
a300: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a310: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71  r(pMaster);.  sq
a320: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a330: 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65  r(pMem);.  winMe
a340: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
a350: 20 20 69 66 28 20 77 69 6e 4d 65 6d 47 65 74 48    if( winMemGetH
a360: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77  eap()!=NULL && w
a370: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
a380: 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  && sqlite3_memor
a390: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20  y_used()==0 ){. 
a3a0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20     /*.    ** At 
a3b0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 72  this point, ther
a3c0: 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f  e should be no o
a3d0: 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72  utstanding memor
a3e0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e  y allocations on
a3f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 65 61 70  .    ** the heap
a400: 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62  .  Also, since b
a410: 6f 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 61  oth the master a
a420: 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20  nd memsys locks 
a430: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
a440: 20 20 2a 2a 20 62 65 69 6e 67 20 68 65 6c 64 20    ** being held 
a450: 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20  by us, no other 
a460: 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66  function (i.e. f
a470: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65  rom another thre
a480: 61 64 29 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a  ad) should.    *
a490: 2a 20 62 65 20 61 62 6c 65 20 74 6f 20 65 76 65  * be able to eve
a4a0: 6e 20 61 63 63 65 73 73 20 74 68 65 20 68 65 61  n access the hea
a4b0: 70 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 64  p.  Attempt to d
a4c0: 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65  estroy and recre
a4d0: 61 74 65 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69  ate our.    ** i
a4e0: 73 6f 6c 61 74 65 64 20 57 69 6e 33 32 20 6e 61  solated Win32 na
a4f0: 74 69 76 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20  tive heap now.. 
a500: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
a510: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a520: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
a530: 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74  ssert( winMemGet
a540: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
a550: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a560: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
a570: 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75  );.    winMemShu
a580: 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44  tdown(winMemGetD
a590: 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61  ataPtr());.    a
a5a0: 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74  ssert( winMemGet
a5b0: 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a  Heap()==NULL );.
a5c0: 20 20 20 20 61 73 73 65 72 74 28 20 21 77 69 6e      assert( !win
a5d0: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b  MemGetOwned() );
a5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
a5f0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a600: 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ()==0 );.    rc 
a610: 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e  = winMemInit(win
a620: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
a630: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
a640: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77  !=SQLITE_OK || w
a650: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
a660: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
a670: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
a680: 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77  K || winMemGetOw
a690: 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73  ned() );.    ass
a6a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a6b0: 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65  OK || sqlite3_me
a6c0: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
a6d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a6e0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 57 69 6e  *.    ** The Win
a6f0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 63  32 native heap c
a700: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
a710: 64 20 62 65 63 61 75 73 65 20 69 74 20 6d 61 79  d because it may
a720: 20 62 65 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   be in use..    
a730: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
a740: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73  TE_BUSY;.  }.  s
a750: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a760: 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  ve(pMem);.  sqli
a770: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a780: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
a790: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
a7a0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
a7b0: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
a7c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
a7d0: 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69  utputs the speci
a7e0: 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69  fied (ANSI) stri
a7f0: 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  ng to the Win32 
a800: 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20  debugger.** (if 
a810: 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a  available)..*/..
a820: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
a830: 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63  32_write_debug(c
a840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c  onst char *zBuf,
a850: 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68   int nBuf){.  ch
a860: 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54  ar zDbgBuf[SQLIT
a870: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a880: 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69  SIZE];.  int nMi
a890: 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53  n = MIN(nBuf, (S
a8a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a8b0: 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20  BUF_SIZE - 1)); 
a8c0: 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69  /* may be negati
a8d0: 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69  ve. */.  if( nMi
a8e0: 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31  n<-1 ) nMin = -1
a8f0: 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76  ; /* all negativ
a900: 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20  e values become 
a910: 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  -1. */.  assert(
a920: 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69   nMin==-1 || nMi
a930: 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c  n==0 || nMin<SQL
a940: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
a950: 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65  F_SIZE );.#if de
a960: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
a970: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69  32_HAS_ANSI).  i
a980: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
a990: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
a9a0: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
a9b0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
a9c0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
a9d0: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
a9e0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
a9f0: 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75  ugStringA(zDbgBu
aa00: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
aa10: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
aa20: 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d  ringA(zBuf);.  }
aa30: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
aa40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
aa50: 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a  WIDE).  memset(z
aa60: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
aa70: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
aa80: 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73  SIZE);.  if ( os
aa90: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
aaa0: 68 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f  har(.          o
aab0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
aac0: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
aad0: 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c  _OEMCP, 0, zBuf,
aae0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c  .          nMin,
aaf0: 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66   (LPWSTR)zDbgBuf
ab00: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
ab10: 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65  BG_BUF_SIZE/size
ab20: 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b  of(WCHAR))<=0 ){
ab30: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
ab40: 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  .  osOutputDebug
ab50: 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52  StringW((LPCWSTR
ab60: 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65  )zDbgBuf);.#else
ab70: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
ab80: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
ab90: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
aba0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
abb0: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
abc0: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
abd0: 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  in);.    fprintf
abe0: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
abf0: 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65  DbgBuf);.  }else
ac00: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
ac10: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66  derr, "%s", zBuf
ac20: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
ac30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
ac40: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73  wing routine sus
ac50: 70 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e  pends the curren
ac60: 74 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20  t thread for at 
ac70: 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c  least ms.** mill
ac80: 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20  iseconds.  This 
ac90: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
aca0: 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70   the Win32 Sleep
acb0: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  () interface..*/
acc0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
acd0: 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44  INRT.static HAND
ace0: 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55  LE sleepObj = NU
acf0: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64  LL;.#endif..void
ad00: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
ad10: 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69  leep(DWORD milli
ad20: 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51  seconds){.#if SQ
ad30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
ad40: 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e  if ( sleepObj==N
ad50: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70  ULL ){.    sleep
ad60: 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76  Obj = osCreateEv
ad70: 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c  entExW(NULL, NUL
ad80: 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f  L, CREATE_EVENT_
ad90: 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20  MANUAL_RESET,.  
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59                SY
adc0: 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a  NCHRONIZE);.  }.
add0: 20 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f    assert( sleepO
ade0: 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73  bj!=NULL );.  os
adf0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
ae00: 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20  ectEx(sleepObj, 
ae10: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41  milliseconds, FA
ae20: 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73  LSE);.#else.  os
ae30: 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e  Sleep(millisecon
ae40: 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  ds);.#endif.}..#
ae50: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
ae60: 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 26  RKER_THREADS>0 &
ae70: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
ae80: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
ae90: 5f 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20  _WINRT && \.    
aea0: 20 20 20 20 53 51 4c 49 54 45 5f 54 48 52 45 41      SQLITE_THREA
aeb0: 44 53 41 46 45 3e 30 0a 44 57 4f 52 44 20 73 71  DSAFE>0.DWORD sq
aec0: 6c 69 74 65 33 57 69 6e 33 32 57 61 69 74 28 48  lite3Win32Wait(H
aed0: 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a  ANDLE hObject){.
aee0: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68    DWORD rc;.  wh
aef0: 69 6c 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69  ile( (rc = osWai
af00: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
af10: 45 78 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49  Ex(hObject, INFI
af20: 4e 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  NITE,.          
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55               TRU
af50: 45 29 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d  E))==WAIT_IO_COM
af60: 50 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65  PLETION ){}.  re
af70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
af80: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
af90: 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  true (non-zero) 
afa0: 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  if we are runnin
afb0: 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57  g under WinNT, W
afc0: 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20  in2K, WinXP,.** 
afd0: 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72  or WinCE.  Retur
afe0: 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66  n false (zero) f
aff0: 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  or Win95, Win98,
b000: 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a   or WinME..**.**
b010: 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65   Here is an inte
b020: 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74  resting observat
b030: 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e  ion:  Win95, Win
b040: 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61  98, and WinME la
b050: 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ck.** the LockFi
b060: 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74  leEx() API.  But
b070: 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74   we can still st
b080: 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67  atically link ag
b090: 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50  ainst that.** AP
b0a0: 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20  I as long as we 
b0b0: 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68  don't call it wh
b0c0: 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35  en running Win95
b0d0: 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20  /98/ME.  A call 
b0e0: 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
b0f0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
b100: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68  termine if the h
b110: 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f  ost is Win95/98/
b120: 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32  ME or.** WinNT/2
b130: 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20  K/XP so that we 
b140: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65  will know whethe
b150: 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20  r or not we can 
b160: 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74  safely call.** t
b170: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
b180: 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 53 51  API..*/..#if !SQ
b190: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
b1a0: 52 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65  RSIONEX.# define
b1b0: 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23   osIsNT()  (1).#
b1c0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  elif SQLITE_OS_W
b1d0: 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
b1e0: 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69  S_WINRT || !defi
b1f0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b200: 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66  _HAS_ANSI).# def
b210: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
b220: 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64  ).#elif !defined
b230: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
b240: 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65  S_WIDE).# define
b250: 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23   osIsNT()  (0).#
b260: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6f 73  else.# define os
b270: 49 73 4e 54 28 29 20 20 28 28 73 71 6c 69 74 65  IsNT()  ((sqlite
b280: 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c  3_os_type==2) ||
b290: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69   sqlite3_win32_i
b2a0: 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a  s_nt()).#endif..
b2b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b2c0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69  ion determines i
b2d0: 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73  f the machine is
b2e0: 20 72 75 6e 6e 69 6e 67 20 61 20 76 65 72 73 69   running a versi
b2f0: 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a  on of Windows.**
b300: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
b310: 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20   kernel..*/.int 
b320: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73  sqlite3_win32_is
b330: 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66 20 53  _nt(void){.#if S
b340: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
b350: 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54   /*.  ** NOTE: T
b360: 68 65 20 57 69 6e 52 54 20 73 75 62 2d 70 6c 61  he WinRT sub-pla
b370: 74 66 6f 72 6d 20 69 73 20 61 6c 77 61 79 73 20  tform is always 
b380: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61  assumed to be ba
b390: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20  sed on the NT.  
b3a0: 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e  **       kernel.
b3b0: 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  .  */.  return 1
b3c0: 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 57  ;.#elif SQLITE_W
b3d0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
b3e0: 58 0a 20 20 69 66 28 20 6f 73 49 6e 74 65 72 6c  X.  if( osInterl
b3f0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
b400: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
b410: 5f 74 79 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20  _type, 0, 0)==0 
b420: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
b430: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b440: 41 4e 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53  ANSI).    OSVERS
b450: 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a  IONINFOA sInfo;.
b460: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
b470: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
b480: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
b490: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
b4a0: 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xA(&sInfo);.    
b4b0: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
b4c0: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
b4d0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20  lite3_os_type,. 
b4e0: 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77         (sInfo.dw
b4f0: 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45  PlatformId == VE
b500: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
b510: 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29  _NT) ? 2 : 1, 0)
b520: 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
b530: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b540: 5f 57 49 44 45 29 0a 20 20 20 20 4f 53 56 45 52  _WIDE).    OSVER
b550: 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b  SIONINFOW sInfo;
b560: 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56  .    sInfo.dwOSV
b570: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
b580: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
b590: 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e      osGetVersion
b5a0: 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20  ExW(&sInfo);.   
b5b0: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
b5c0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
b5d0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a  qlite3_os_type,.
b5e0: 20 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64          (sInfo.d
b5f0: 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56  wPlatformId == V
b600: 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33  ER_PLATFORM_WIN3
b610: 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30  2_NT) ? 2 : 1, 0
b620: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
b630: 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f  return osInterlo
b640: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
b650: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
b660: 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a  type, 2, 2)==2;.
b670: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53  #elif SQLITE_TES
b680: 54 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74  T.  return osInt
b690: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
b6a0: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
b6b0: 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d  _os_type, 2, 2)=
b6c0: 3d 32 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20  =2;.#else.  /*. 
b6d0: 20 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75   ** NOTE: All su
b6e0: 62 2d 70 6c 61 74 66 6f 72 6d 73 20 77 68 65 72  b-platforms wher
b6f0: 65 20 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e  e the GetVersion
b700: 45 78 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73  Ex[AW] functions
b710: 20 61 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 20   are.  **       
b720: 64 65 70 72 65 63 61 74 65 64 20 61 72 65 20 61  deprecated are a
b730: 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f  lways assumed to
b740: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
b750: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f   NT kernel..  */
b760: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
b770: 64 69 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  dif.}..#ifdef SQ
b780: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
b790: 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  C./*.** Allocate
b7a0: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
b7b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
b7c0: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
b7d0: 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48  int nBytes){.  H
b7e0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76  ANDLE hHeap;.  v
b7f0: 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65  oid *p;..  winMe
b800: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
b810: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
b820: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
b830: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
b840: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
b850: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
b860: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
b870: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
b880: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
b890: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
b8a0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
b8b0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
b8c0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
b8d0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
b8e0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
b8f0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
b900: 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73  s>=0 );.  p = os
b910: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
b920: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b930: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
b940: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28  T)nBytes);.  if(
b950: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
b960: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
b970: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
b980: 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74  HeapAlloc %u byt
b990: 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  es (%lu), heap=%
b9a0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
b9b0: 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65      nBytes, osGe
b9c0: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
b9d0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
b9e0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
b9f0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
ba00: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
ba10: 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69  d winMemFree(voi
ba20: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41  d *pPrior){.  HA
ba30: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77  NDLE hHeap;..  w
ba40: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
ba50: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
ba60: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
ba70: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
ba80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
ba90: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
baa0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
bab0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
bac0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
bad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
bae0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
baf0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
bb00: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
bb10: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
bb20: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
bb30: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50  #endif.  if( !pP
bb40: 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f  rior ) return; /
bb50: 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74  * Passing NULL t
bb60: 6f 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e  o HeapFree is un
bb70: 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66  defined. */.  if
bb80: 28 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48  ( !osHeapFree(hH
bb90: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
bba0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
bbb0: 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  rior) ){.    sql
bbc0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bbd0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
bbe0: 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b  o HeapFree block
bbf0: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
bc00: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
bc10: 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47       pPrior, osG
bc20: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
bc30: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
bc40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
bc50: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
bc60: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
bc70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
bc80: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
bc90: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
bca0: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
bcb0: 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  es){.  HANDLE hH
bcc0: 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  eap;.  void *p;.
bcd0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
bce0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
bcf0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
bd00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
bd10: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
bd20: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
bd30: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
bd40: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
bd50: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
bd60: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
bd70: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
bd80: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
bd90: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
bda0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
bdb0: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
bdc0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
bdd0: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
bde0: 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  ;.  if( !pPrior 
bdf0: 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  ){.    p = osHea
be00: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
be10: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
be20: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
be30: 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Bytes);.  }else{
be40: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52  .    p = osHeapR
be50: 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  eAlloc(hHeap, SQ
be60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
be70: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28  FLAGS, pPrior, (
be80: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
be90: 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a    }.  if( !p ){.
bea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
beb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
bec0: 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62  ailed to %s %u b
bed0: 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70  ytes (%lu), heap
bee0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
bef0: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
bf00: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
bf10: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
bf20: 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  es, osGetLastErr
bf30: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
bf40: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65        (void*)hHe
bf50: 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ap);.  }.  retur
bf60: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
bf70: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
bf80: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
bf90: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62  allocation, in b
bfa0: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
bfb0: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
bfc0: 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c  oid *p){.  HANDL
bfd0: 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f  E hHeap;.  SIZE_
bfe0: 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  T n;..  winMemAs
bff0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
c000: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
c010: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
c020: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
c030: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
c040: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
c050: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
c060: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
c070: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
c080: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
c090: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
c0a0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
c0b0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c0c0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
c0d0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
c0e0: 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
c0f0: 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65    n = osHeapSize
c100: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
c110: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
c120: 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53   p);.  if( n==(S
c130: 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20  IZE_T)-1 ){.    
c140: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c150: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
c160: 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c  d to HeapSize bl
c170: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
c180: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
c190: 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74          p, osGet
c1a0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
c1b0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
c1c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c1d0: 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d  return (int)n;.}
c1e0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
c1f0: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
c200: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
c210: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
c220: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c230: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
c240: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
c250: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  n;.}../*.** Init
c260: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
c270: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
c280: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
c290: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
c2a0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
c2b0: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
c2c0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
c2d0: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
c2e0: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53  mData ) return S
c2f0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61  QLITE_ERROR;.  a
c300: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
c310: 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d  ta->magic1==WINM
c320: 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61  EM_MAGIC1 );.  a
c330: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
c340: 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ta->magic2==WINM
c350: 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69  EM_MAGIC2 );..#i
c360: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
c370: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
c380: 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20  32_HEAP_CREATE. 
c390: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
c3a0: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
c3b0: 44 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53  DWORD dwInitialS
c3c0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  ize = SQLITE_WIN
c3d0: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
c3e0: 45 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d  E;.    DWORD dwM
c3f0: 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57  aximumSize = (DW
c400: 4f 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61  ORD)sqlite3Globa
c410: 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20  lConfig.nHeap;. 
c420: 20 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d     if( dwMaximum
c430: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
c440: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d   dwMaximumSize =
c450: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
c460: 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20  AP_MAX_SIZE;.   
c470: 20 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69   }else if( dwIni
c480: 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d  tialSize>dwMaxim
c490: 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  umSize ){.      
c4a0: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20  dwInitialSize = 
c4b0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20  dwMaximumSize;. 
c4c0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
c4d0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73  Data->hHeap = os
c4e0: 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54  HeapCreate(SQLIT
c4f0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c500: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74            dwInit
c530: 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d  ialSize, dwMaxim
c540: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  umSize);.    if(
c550: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
c560: 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Heap ){.      sq
c570: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c580: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
c590: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61    "failed to Hea
c5a0: 70 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66  pCreate (%lu), f
c5b0: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
c5c0: 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25  e=%lu, maxSize=%
c5d0: 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f  lu",.          o
c5e0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c5f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
c600: 41 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74  AP_FLAGS, dwInit
c610: 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ialSize,.       
c620: 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65     dwMaximumSize
c630: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c640: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
c650: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  T;.    }.    pWi
c660: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
c670: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73   = TRUE;.    ass
c680: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c690: 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a  ->bOwned );.  }.
c6a0: 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44  #else.  pWinMemD
c6b0: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47  ata->hHeap = osG
c6c0: 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b  etProcessHeap();
c6d0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
c6e0: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
c6f0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c700: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20  LITE_NOMEM,.    
c710: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47      "failed to G
c720: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25  etProcessHeap (%
c730: 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45  lu)", osGetLastE
c740: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74  rror());.    ret
c750: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c760: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 57 69  _BKPT;.  }.  pWi
c770: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
c780: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65   = FALSE;.  asse
c790: 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  rt( !pWinMemData
c7a0: 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64  ->bOwned );.#end
c7b0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  if.  assert( pWi
c7c0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
c7d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c7e0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c7f0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
c800: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
c810: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
c820: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
c830: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
c840: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
c850: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
c860: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
c870: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c880: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c890: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
c8a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c8b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69  OK;.}../*.** Dei
c8c0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
c8d0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
c8e0: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
c8f0: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
c900: 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61  ata){.  winMemDa
c910: 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20  ta *pWinMemData 
c920: 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29  = (winMemData *)
c930: 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  pAppData;..  if(
c940: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20   !pWinMemData ) 
c950: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c960: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
c970: 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic1==WINMEM_MA
c980: 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74  GIC1 );.  assert
c990: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
c9a0: 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic2==WINMEM_MA
c9b0: 47 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70  GIC2 );..  if( p
c9c0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c9d0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
c9e0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
c9f0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
ca00: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
ca10: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
ca20: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
ca30: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
ca40: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61  _VALIDATE).    a
ca50: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
ca60: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
ca70: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
ca80: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
ca90: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
caa0: 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d  if.    if( pWinM
cab0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
cac0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48  {.      if( !osH
cad0: 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d  eapDestroy(pWinM
cae0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29  emData->hHeap) )
caf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
cb00: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
cb10: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
cb20: 65 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29  eapDestroy (%lu)
cb30: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
cb60: 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d  , (void*)pWinMem
cb70: 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20  Data->hHeap);.  
cb80: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
cb90: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cba0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
cbb0: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
cbc0: 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hHeap = NULL;.  
cbd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  }.}../*.** Popul
cbe0: 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  ate the low-leve
cbf0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
cc00: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ion function poi
cc10: 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69  nters in.** sqli
cc20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
cc30: 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  m with pointers 
cc40: 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20  to the routines 
cc50: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68  in this file. Th
cc60: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73  e.** arguments s
cc70: 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b  pecify the block
cc80: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61   of memory to ma
cc90: 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nage..**.** This
cca0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
ccb0: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
ccc0: 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64  e3_config(), and
ccd0: 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73   therefore.** is
cce0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
ccf0: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28   be threadsafe (
cd00: 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63  it is not)..*/.c
cd10: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
cd20: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
cd30: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
cd40: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
cd50: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
cd60: 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74  ethods winMemMet
cd70: 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e  hods = {.    win
cd80: 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  MemMalloc,.    w
cd90: 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77  inMemFree,.    w
cda0: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  inMemRealloc,.  
cdb0: 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20    winMemSize,.  
cdc0: 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c    winMemRoundup,
cdd0: 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c  .    winMemInit,
cde0: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
cdf0: 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65  own,.    &win_me
ce00: 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65  m_data.  };.  re
ce10: 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68  turn &winMemMeth
ce20: 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  ods;.}..void sql
ce30: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
ce40: 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  t(void){.  sqlit
ce50: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
ce60: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20  _CONFIG_MALLOC, 
ce70: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
ce80: 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  32());.}.#endif 
ce90: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
cea0: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
ceb0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
cec0: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
ced0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54  soft Unicode (UT
cee0: 46 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70  F-16?)..**.** Sp
cef0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
cf00: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
cf10: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
cf20: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74   malloc..*/.stat
cf30: 69 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66  ic LPWSTR winUtf
cf40: 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
cf50: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20   char *zText){. 
cf60: 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50   int nChar;.  LP
cf70: 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 3b 0a  WSTR zWideText;.
cf80: 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c  .  nChar = osMul
cf90: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
cfa0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65  (CP_UTF8, 0, zTe
cfb0: 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  xt, -1, NULL, 0)
cfc0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
cfd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cfe0: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 54 65 78  ;.  }.  zWideTex
cff0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
d000: 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a  cZero( nChar*siz
d010: 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20  eof(WCHAR) );.  
d020: 69 66 28 20 7a 57 69 64 65 54 65 78 74 3d 3d 30  if( zWideText==0
d030: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d040: 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20  ;.  }.  nChar = 
d050: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
d060: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
d070: 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 57 69  , zText, -1, zWi
d080: 64 65 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20  deText,.        
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a          nChar);.
d0b0: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
d0c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
d0d0: 65 65 28 7a 57 69 64 65 54 65 78 74 29 3b 0a 20  ee(zWideText);. 
d0e0: 20 20 20 7a 57 69 64 65 54 65 78 74 20 3d 20 30     zWideText = 0
d0f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
d100: 57 69 64 65 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a  WideText;.}../*.
d110: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
d120: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
d130: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
d140: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
d150: 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  ed string is.** 
d160: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
d170: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d180: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
d190: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
d1a0: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54 65  (LPCWSTR zWideTe
d1b0: 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  xt){.  int nByte
d1c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b  ;.  char *zText;
d1d0: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
d1e0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
d1f0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
d200: 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c 20  ideText, -1, 0, 
d210: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
d220: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
d230: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d240: 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65    zText = sqlite
d250: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
d260: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78  te );.  if( zTex
d270: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
d280: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
d290: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
d2a0: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
d2b0: 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c  8, 0, zWideText,
d2c0: 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79 74   -1, zText, nByt
d2d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20     0, 0);.  if( 
d300: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
d310: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d320: 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78 74  Text);.    zText
d330: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
d340: 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zText;.}../*.
d350: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
d360: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
d370: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
d380: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d390: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
d3a0: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
d3b0: 6c 65 20 61 70 69 73 2e 0a 2a 2a 0a 2a 2a 20 53  le apis..**.** S
d3c0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
d3d0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
d3e0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
d3f0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d400: 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  loc..*/.static L
d410: 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55  PWSTR winMbcsToU
d420: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
d430: 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73  r *zText, int us
d440: 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20 6e 42  eAnsi){.  int nB
d450: 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d  yte;.  LPWSTR zM
d460: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69  bcsFilename;.  i
d470: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73  nt codepage = us
d480: 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a  eAnsi ? CP_ACP :
d490: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d4a0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
d4b0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
d4c0: 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20  page, 0, zText, 
d4d0: 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  -1, NULL,.      
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a            0)*siz
d500: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66  eof(WCHAR);.  if
d510: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
d520: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d530: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
d540: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
d550: 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
d560: 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b  f(zMbcsFilename[
d570: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62  0]) );.  if( zMb
d580: 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  csFilename==0 ){
d590: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d5a0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d   }.  nByte = osM
d5b0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
d5c0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
d5d0: 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 4d 62 63 73  zText, -1, zMbcs
d5e0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
d610: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
d620: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
d630: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61  free(zMbcsFilena
d640: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69  me);.    zMbcsFi
d650: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
d660: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69    return zMbcsFi
d670: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
d680: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
d690: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75  ft Unicode to mu
d6a0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
d6b0: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
d6c0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
d6d0: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e  s ANSI codepage.
d6e0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
d6f0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
d700: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
d710: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
d720: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d730: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
d740: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
d750: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54 65 78  LPCWSTR zWideTex
d760: 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b  t, int useAnsi){
d770: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
d780: 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20 69  char *zText;.  i
d790: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73  nt codepage = us
d7a0: 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a  eAnsi ? CP_ACP :
d7b0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d7c0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d7d0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
d7e0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54 65  page, 0, zWideTe
d7f0: 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  xt, -1, 0, 0, 0,
d800: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
d810: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
d820: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65  urn 0;.  }.  zTe
d830: 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  xt = sqlite3Mall
d840: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
d850: 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20  .  if( zText==0 
d860: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d870: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
d880: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
d890: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
d8a0: 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c  , zWideText, -1,
d8b0: 20 7a 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20   zText,.        
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
d8e0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
d8f0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
d900: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
d910: 29 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d 20 30  );.    zText = 0
d920: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
d930: 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Text;.}../*.** C
d940: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
d950: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
d960: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
d970: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
d980: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
d990: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
d9a0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d9b0: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
d9c0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
d9d0: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
d9e0: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 63  har *zText){.  c
d9f0: 68 61 72 20 2a 7a 54 65 78 74 55 74 66 38 3b 0a  har *zTextUtf8;.
da00: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
da10: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
da20: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
da30: 65 28 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69  e(zText, osAreFi
da40: 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20  leApisANSI());. 
da50: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
da60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
da70: 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 55 74 66  ;.  }.  zTextUtf
da80: 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  8 = winUnicodeTo
da90: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
daa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
dab0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
dac0: 72 6e 20 7a 54 65 78 74 55 74 66 38 3b 0a 7d 0a  rn zTextUtf8;.}.
dad0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
dae0: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
daf0: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
db00: 2d 38 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53  -8 using the ANS
db10: 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 20 53  I codepage..** S
db20: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
db30: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
db40: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
db50: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
db60: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
db70: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
db80: 74 6f 5f 75 74 66 38 5f 76 69 61 5f 61 6e 73 69  to_utf8_via_ansi
db90: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
dba0: 78 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65  xt){.  char *zTe
dbb0: 78 74 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  xtUtf8;.  LPWSTR
dbc0: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
dbd0: 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73  mpWide = winMbcs
dbe0: 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c  ToUnicode(zText,
dbf0: 20 31 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57   1);.  if( zTmpW
dc00: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
dc10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54  turn 0;.  }.  zT
dc20: 65 78 74 55 74 66 38 20 3d 20 77 69 6e 55 6e 69  extUtf8 = winUni
dc30: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57  codeToUtf8(zTmpW
dc40: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
dc50: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
dc60: 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 55 74    return zTextUt
dc70: 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  f8;.}../*.** Con
dc80: 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63  vert multibyte c
dc90: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
dca0: 74 6f 20 55 54 46 2d 38 20 75 73 69 6e 67 20 74  to UTF-8 using t
dcb0: 68 65 20 4f 45 4d 20 63 6f 64 65 70 61 67 65 2e  he OEM codepage.
dcc0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
dcd0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
dce0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
dcf0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
dd00: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
dd10: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
dd20: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 69 61  mbcs_to_utf8_via
dd30: 5f 6f 65 6d 28 63 6f 6e 73 74 20 63 68 61 72 20  _oem(const char 
dd40: 2a 7a 54 65 78 74 29 7b 0a 20 20 63 68 61 72 20  *zText){.  char 
dd50: 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20 20 4c 50  *zTextUtf8;.  LP
dd60: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
dd70: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
dd80: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 54  MbcsToUnicode(zT
dd90: 65 78 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a  ext, 0);.  if( z
dda0: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
ddb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ddc0: 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77 69    zTextUtf8 = wi
ddd0: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
dde0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
ddf0: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
de00: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65  e);.  return zTe
de10: 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xtUtf8;.}../*.**
de20: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
de30: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
de40: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
de50: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
de60: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72  .** returned str
de70: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
de80: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
de90: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
dea0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
deb0: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
dec0: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20   char *zText){. 
ded0: 20 63 68 61 72 20 2a 7a 54 65 78 74 4d 62 63 73   char *zTextMbcs
dee0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
def0: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
df00: 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
df10: 6f 64 65 28 7a 54 65 78 74 29 3b 0a 20 20 69 66  ode(zText);.  if
df20: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
df30: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
df40: 20 7d 0a 20 20 7a 54 65 78 74 4d 62 63 73 20 3d   }.  zTextMbcs =
df50: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63   winUnicodeToMbc
df60: 73 28 7a 54 6d 70 57 69 64 65 2c 20 6f 73 41 72  s(zTmpWide, osAr
df70: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29  eFileApisANSI())
df80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
df90: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
dfa0: 74 75 72 6e 20 7a 54 65 78 74 4d 62 63 73 3b 0a  turn zTextMbcs;.
dfb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
dfc0: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
dfd0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
dfe0: 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 41  ring using the A
dff0: 4e 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a  NSI codepage..**
e000: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
e010: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
e020: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
e030: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
e040: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
e050: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
e060: 38 5f 74 6f 5f 6d 62 63 73 5f 76 69 61 5f 61 6e  8_to_mbcs_via_an
e070: 73 69 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  si(const char *z
e080: 54 65 78 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Text){.  char *z
e090: 54 65 78 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53  TextMbcs;.  LPWS
e0a0: 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  TR zTmpWide;..  
e0b0: 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74  zTmpWide = winUt
e0c0: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78  f8ToUnicode(zTex
e0d0: 74 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69  t);.  if( zTmpWi
e0e0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  de==0 ){.    ret
e0f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65  urn 0;.  }.  zTe
e100: 78 74 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63  xtMbcs = winUnic
e110: 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69  odeToMbcs(zTmpWi
e120: 64 65 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  de, 1);.  sqlite
e130: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
e140: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74  ;.  return zText
e150: 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Mbcs;.}../*.** C
e160: 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20  onvert UTF-8 to 
e170: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
e180: 74 65 72 20 73 74 72 69 6e 67 20 75 73 69 6e 67  ter string using
e190: 20 74 68 65 20 4f 45 4d 20 63 6f 64 65 70 61 67   the OEM codepag
e1a0: 65 2e 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  e..** Space to h
e1b0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
e1c0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
e1d0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
e1e0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68  _malloc()..*/.ch
e1f0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
e200: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76  2_utf8_to_mbcs_v
e210: 69 61 5f 6f 65 6d 28 63 6f 6e 73 74 20 63 68 61  ia_oem(const cha
e220: 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 63 68 61  r *zText){.  cha
e230: 72 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a 20 20  r *zTextMbcs;.  
e240: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
e250: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77  ..  zTmpWide = w
e260: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
e270: 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20 7a 54  zText);.  if( zT
e280: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
e290: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
e2a0: 20 7a 54 65 78 74 4d 62 63 73 20 3d 20 77 69 6e   zTextMbcs = win
e2b0: 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54  UnicodeToMbcs(zT
e2c0: 6d 70 57 69 64 65 2c 20 30 29 3b 0a 20 20 73 71  mpWide, 0);.  sq
e2d0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
e2e0: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
e2f0: 54 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  TextMbcs;.}../*.
e300: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e310: 20 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64   sets the data d
e320: 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20  irectory or the 
e330: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
e340: 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ory based on.** 
e350: 74 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67  the provided arg
e360: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70  uments.  The typ
e370: 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  e argument must 
e380: 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f  be 1 in order to
e390: 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   set the.** data
e3a0: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20   directory or 2 
e3b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
e3c0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
e3d0: 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56  rectory.  The zV
e3e0: 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  alue.** argument
e3f0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
e400: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f  the directory to
e410: 20 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72   use.  The retur
e420: 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a  n value will be.
e430: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
e440: 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69  successful..*/.i
e450: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
e460: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44  _set_directory(D
e470: 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53  WORD type, LPCWS
e480: 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68  TR zValue){.  ch
e490: 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79  ar **ppDirectory
e4a0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
e4b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
e4c0: 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  IT.  int rc = sq
e4d0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e4e0: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
e4f0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
e500: 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  .  if( type==SQL
e510: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
e520: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
e530: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
e540: 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61   = &sqlite3_data
e550: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65  _directory;.  }e
e560: 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51  lse if( type==SQ
e570: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
e580: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29  DIRECTORY_TYPE )
e590: 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72  {.    ppDirector
e5a0: 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d  y = &sqlite3_tem
e5b0: 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d  p_directory;.  }
e5c0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
e5d0: 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d  rectory || type=
e5e0: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
e5f0: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
e600: 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74  E.          || t
e610: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
e620: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
e630: 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73  _TYPE.  );.  ass
e640: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
e650: 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64  y || sqlite3Memd
e660: 65 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44  ebugHasType(*ppD
e670: 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50  irectory, MEMTYP
e680: 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28  E_HEAP) );.  if(
e690: 20 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a   ppDirectory ){.
e6a0: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65      char *zValue
e6b0: 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66  Utf8 = 0;.    if
e6c0: 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c  ( zValue && zVal
e6d0: 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  ue[0] ){.      z
e6e0: 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55  ValueUtf8 = winU
e6f0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61  nicodeToUtf8(zVa
e700: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
e710: 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29   zValueUtf8==0 )
e720: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
e730: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
e740: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
e750: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
e760: 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29  ee(*ppDirectory)
e770: 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f  ;.    *ppDirecto
e780: 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b  ry = zValueUtf8;
e790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e7a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
e7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  ;.}../*.** The r
e7d0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77  eturn value of w
e7e0: 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
e7f0: 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  g.** is zero if 
e800: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
e810: 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
e820: 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
e830: 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
e840: 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
e850: 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a  as truncated)..*
e860: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
e870: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
e880: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
e890: 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
e8a0: 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72  *zBuf){.  /* For
e8b0: 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72  matMessage retur
e8c0: 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e  ns 0 on failure.
e8d0: 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20    Otherwise it. 
e8e0: 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20   ** returns the 
e8f0: 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73  number of TCHARs
e900: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
e910: 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66  output.  ** buff
e920: 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68  er, excluding th
e930: 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75  e terminating nu
e940: 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20  ll char..  */.  
e950: 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b  DWORD dwLen = 0;
e960: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20  .  char *zOut = 
e970: 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  0;..  if( osIsNT
e980: 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
e990: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43  _OS_WINRT.    WC
e9a0: 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51  HAR zTempWide[SQ
e9b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45  LITE_WIN32_MAX_E
e9c0: 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a  RRMSG_CHARS+1];.
e9d0: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
e9e0: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
e9f0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
ea00: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
ea30: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
ea40: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea60: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
ea90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
eab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
ead0: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaf0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
eb00: 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48  32_MAX_ERRMSG_CH
eb10: 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ARS,.           
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20    0);.#else.    
eb40: 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65  LPWSTR zTempWide
eb50: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c   = NULL;.    dwL
eb60: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
eb70: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
eb80: 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55  SAGE_ALLOCATE_BU
eb90: 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20  FFER |.         
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebb0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
ebc0: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
ebf0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
ec00: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a            NULL,.
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 20 20 20 6c 61 73               las
ec50: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a       (LPWSTR) &z
eca0: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69         0);.#endi
ecf0: 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  f.    if( dwLen 
ed00: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
ed10: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
ed20: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
ed30: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
ed40: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
ed50: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
ed60: 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f   zOut = winUnico
ed70: 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69  deToUtf8(zTempWi
ed80: 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  de);.      sqlit
ed90: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
eda0: 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  c();.#if !SQLITE
edb0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
edc0: 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74  /* free the syst
edd0: 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  em buffer alloca
ede0: 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73  ted by FormatMes
edf0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73  sage */.      os
ee00: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57  LocalFree(zTempW
ee10: 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ide);.#endif.   
ee20: 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
ee30: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
ee40: 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
ee50: 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55  char *zTemp = NU
ee60: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
ee70: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  osFormatMessageA
ee80: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
ee90: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
eea0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
eec0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
eed0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
ef00: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
ef10: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
ef60: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a  (LPSTR) &zTemp,.
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
eff0: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
f000: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
f010: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
f020: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
f030: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
f040: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
f050: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
f060: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
f070: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
f080: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  8(zTemp);.      
f090: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
f0a0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
f0b0: 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74  /* free the syst
f0c0: 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  em buffer alloca
f0d0: 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73  ted by FormatMes
f0e0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73  sage */.      os
f0f0: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29  LocalFree(zTemp)
f100: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f110: 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77  if.  if( 0 == dw
f120: 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
f130: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
f140: 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72  , zBuf, "OsError
f150: 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c   0x%lx (%lu)", l
f160: 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72  astErrno, lastEr
f170: 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rno);.  }else{. 
f180: 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78     /* copy a max
f190: 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61  imum of nBuf cha
f1a0: 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66  rs to output buf
f1b0: 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fer */.    sqlit
f1c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
f1d0: 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f  , zBuf, "%s", zO
f1e0: 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65  ut);.    /* free
f1f0: 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72   the UTF8 buffer
f200: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
f210: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a  free(zOut);.  }.
f220: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f230: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
f240: 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72  ction - winLogEr
f250: 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73  rorAtLine() - is
f260: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
f270: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
f280: 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29  ** winLogError()
f290: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f2a0: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
f2b0: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
f2c0: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
f2d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c  unction..** It l
f2e0: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
f2f0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
f300: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
f310: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
f320: 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  f.** error code 
f330: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
f340: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
f350: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
f360: 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65  from.** FormatMe
f370: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssage..**.** The
f380: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
f390: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
f3a0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
f3b0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
f3c0: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
f3d0: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
f3e0: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
f3f0: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
f400: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20  E_CANTOPEN)..** 
f410: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
f420: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
f430: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
f440: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
f450: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
f460: 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  d and the associ
f470: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
f480: 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a   path, if any..*
f490: 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67  /.#define winLog
f4a0: 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20  Error(a,b,c,d)  
f4b0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
f4c0: 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e  ne(a,b,c,d,__LIN
f4d0: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
f4e0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
f4f0: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
f500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f510: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
f520: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44  rror code */.  D
f530: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f550: 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72  * Win32 last err
f560: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
f570: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
f580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
f590: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
f5a0: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
f5b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
f5c0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
f5d0: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
f5e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
f5f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
f600: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f610: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
f620: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
f630: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
f640: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
f650: 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20  zMsg[500];      
f660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75             /* Hu
f670: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72  man readable err
f680: 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  or text */.  int
f690: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f6c0: 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a  .  zMsg[0] = 0;.
f6d0: 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
f6e0: 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20  rMsg(lastErrno, 
f6f0: 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d  sizeof(zMsg), zM
f700: 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  sg);.  assert( e
f710: 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrcode!=SQLITE_O
f720: 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  K );.  if( zPath
f730: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
f740: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73  ;.  for(i=0; zMs
f750: 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21  g[i] && zMsg[i]!
f760: 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d  ='\r' && zMsg[i]
f770: 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\n'; i++){}. 
f780: 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20   zMsg[i] = 0;.  
f790: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
f7a0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77  ode,.      "os_w
f7b0: 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25  in.c:%d: (%lu) %
f7c0: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
f7d0: 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72     iLine, lastEr
f7e0: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
f7f0: 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20  h, zMsg.  );..  
f800: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
f810: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  }../*.** The num
f820: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
f830: 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20  t a ReadFile(), 
f840: 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64  WriteFile(), and
f850: 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a   DeleteFile().**
f860: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64   will be retried
f870: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63   following a loc
f880: 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f  king error - pro
f890: 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a  bably caused by.
f8a0: 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66  ** antivirus sof
f8b0: 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65  tware.  Also the
f8c0: 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62   initial delay b
f8d0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
f8e0: 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65  retry..** The de
f8f0: 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69  lay increases li
f900: 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68  nearly with each
f910: 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64   retry..*/.#ifnd
f920: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
f930: 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65  IOERR_RETRY.# de
f940: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
f950: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30  2_IOERR_RETRY 10
f960: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
f970: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
f980: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23  RR_RETRY_DELAY.#
f990: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
f9a0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
f9b0: 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66  _DELAY 25.#endif
f9c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
f9d0: 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49  oerrRetry = SQLI
f9e0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
f9f0: 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74  ETRY;.static int
fa00: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
fa10: 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  lay = SQLITE_WIN
fa20: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
fa30: 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ELAY;../*.** The
fa40: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
fa50: 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73  ry1" macro is us
fa60: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
fa70: 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  if a particular 
fa80: 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  I/O.** error cod
fa90: 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47  e obtained via G
faa0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73  etLastError() is
fab0: 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20   eligible to be 
fac0: 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20  retried.  It.** 
fad0: 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20  must accept the 
fae0: 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44  error code DWORD
faf0: 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67   as its only arg
fb00: 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64  ument and should
fb10: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
fb20: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
fb30: 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65   code is transie
fb40: 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64  nt in nature and
fb50: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a   the operation.*
fb60: 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  * responsible fo
fb70: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  r generating the
fb80: 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20   original error 
fb90: 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70  might succeed up
fba0: 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72  on being.** retr
fbb0: 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65  ied.  The argume
fbc0: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
fbd0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72   should be a var
fbe0: 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  iable..**.** Add
fbf0: 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63  itionally, a mac
fc00: 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65  ro named "winIoe
fc10: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79  rrCanRetry2" may
fc20: 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66   be defined.  If
fc30: 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65   it.** is define
fc40: 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f  d, it will be co
fc50: 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65  nsulted only whe
fc60: 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e  n the macro "win
fc70: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a  IoerrCanRetry1".
fc80: 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  ** returns zero.
fc90: 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43    The "winIoerrC
fca0: 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20  anRetry2" macro 
fcb0: 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70  is completely op
fcc0: 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61  tional and.** ma
fcd0: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63  y be used to inc
fce0: 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  lude additional 
fcf0: 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74  error codes in t
fd00: 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75  he set that shou
fd10: 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ld.** result in 
fd20: 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20  the failing I/O 
fd30: 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20  operation being 
fd40: 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63  retried by the c
fd50: 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65  aller.  If.** de
fd60: 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49  fined, the "winI
fd70: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d  oerrCanRetry2" m
fd80: 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69  acro must exhibi
fd90: 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e  t external seman
fda0: 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61  tics.** identica
fdb0: 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68  l to those of th
fdc0: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
fdd0: 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  try1" macro..*/.
fde0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e  #if !defined(win
fdf0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a  IoerrCanRetry1).
fe00: 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72  #define winIoerr
fe10: 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28  CanRetry1(a) (((
fe20: 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53  a)==ERROR_ACCESS
fe30: 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20  _DENIED)        
fe40: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
fe70: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
fe80: 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20  )    || \.      
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
feb0: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
fec0: 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  ON)       || \. 
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
fef0: 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54  )==ERROR_DEV_NOT
ff00: 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c  _EXIST)        |
ff10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45    ((a)==ERROR_NE
ff40: 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20  TNAME_DELETED)  
ff50: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
ff80: 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20  OR_SEM_TIMEOUT) 
ff90: 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20           || \.  
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
ffc0: 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f  ==ERROR_NETWORK_
ffd0: 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65  UNREACHABLE)).#e
ffe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ndif../*.** If a
fff0: 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57   ReadFile() or W
10000 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72  riteFile() error
10010 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20   occurs, invoke 
10020 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
10030 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f  to see if it sho
10040 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20  uld be retried. 
10050 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20   Return TRUE to 
10060 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46  retry.  Return F
10070 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20  ALSE.** to give 
10080 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  up with an error
10090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
100a0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e  winRetryIoerr(in
100b0 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52  t *pnRetry, DWOR
100c0 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57  D *pError){.  DW
100d0 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73  ORD e = osGetLas
100e0 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  tError();.  if( 
100f0 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65  *pnRetry>=winIoe
10100 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69  rrRetry ){.    i
10110 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
10120 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a     *pError = e;.
10130 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10140 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69   0;.  }.  if( wi
10150 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28  nIoerrCanRetry1(
10160 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
10170 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69  3_win32_sleep(wi
10180 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
10190 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
101a0 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
101b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
101c0 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69  }.#if defined(wi
101d0 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29  nIoerrCanRetry2)
101e0 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49  .  else if( winI
101f0 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29  oerrCanRetry2(e)
10200 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
10210 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49  win32_sleep(winI
10220 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28  oerrRetryDelay*(
10230 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20  1+*pnRetry));.  
10240 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20    ++*pnRetry;.  
10250 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
10260 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72  #endif.  if( pEr
10270 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
10280 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
10290 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
102a0 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
102b0 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
102c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
102d0 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  inLogIoerr(int n
102e0 52 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65 6e  Retry, int linen
102f0 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  o){.  if( nRetry
10300 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
10310 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43  log(SQLITE_NOTIC
10320 45 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  E,.      "delaye
10330 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
10340 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
10350 20 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20 20   at line %d",.  
10360 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
10370 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e  yDelay*nRetry*(n
10380 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e 65  Retry+1)/2, line
10390 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  no.    );.  }.}.
103a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
103b0 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10400 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
10410 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
10420 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
10430 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10440 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
10450 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c  IME_API) || !SQL
10460 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
10470 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65  ME_API./*.** The
10480 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e   MSVC CRT on Win
10490 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20  dows CE may not 
104a0 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65  have a localtime
104b0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f  () function.  So
104c0 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62  .** create a sub
104d0 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63  stitute..*/.#inc
104e0 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
104f0 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
10500 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
10510 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
10520 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
10530 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
10540 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
10550 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
10560 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
10570 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
10580 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
10590 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
105a0 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
105b0 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
105c0 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
105d0 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
105e0 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
105f0 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
10600 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
10610 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
10620 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
10630 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
10640 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
10650 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
10660 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
10670 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
10680 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
10690 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
106a0 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
106b0 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
106c0 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
106d0 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
106e0 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
106f0 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
10700 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
10710 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
10720 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
10730 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
10740 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
10750 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
10760 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
10770 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
10780 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
10790 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
107a0 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
107b0 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
107c0 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
107d0 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
107e0 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
107f0 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
10800 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
10810 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
10820 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
10830 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
10840 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
10850 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
10860 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
10870 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
10880 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
10890 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
108a0 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
108b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
108c0 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
108d0 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
108e0 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
108f0 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
10900 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
10910 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
10920 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
10930 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
10940 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
10950 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
10960 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
10970 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
10980 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
10990 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
109a0 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
109b0 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55  ..  zName = winU
109c0 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
109d0 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
109e0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
109f0 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
10a00 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10a10 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
10a20 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
10a30 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10a40 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
10a50 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
10a60 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
10a70 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
10a80 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
10a90 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
10aa0 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
10ab0 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
10ac0 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
10ad0 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
10ae0 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
10af0 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
10b00 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
10b10 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
10b20 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
10b30 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
10b40 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
10b50 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
10b60 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
10b70 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
10b80 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
10b90 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
10ba0 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
10bb0 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
10bc0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10bd0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10be0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
10bf0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
10c00 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
10c10 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
10c20 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
10c50 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
10c60 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  e);.  }..  /* Ac
10c70 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
10c80 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
10c90 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
10ca0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
10cb0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  hMutex);..  /* S
10cc0 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
10cd0 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
10ce0 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
10cf0 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
10d00 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  re.  ** case-sen
10d10 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
10d20 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
10d30 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
10d40 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
10d50 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
10d60 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
10d70 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
10d80 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
10d90 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
10da0 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
10db0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
10dc0 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
10dd0 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
10de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
10e10 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
10e20 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a         zName);..
10e60 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20    /* Set a flag 
10e70 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77  that indicates w
10e80 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74  e're the first t
10e90 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d  o create the mem
10ea0 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d  ory so it.  ** m
10eb0 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
10ec0 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73  ialized */.  las
10ed0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
10ee0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20  stError();.  if 
10ef0 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52  (lastErrno == ER
10f00 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
10f10 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
10f20 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73   FALSE;.  }..  s
10f30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
10f40 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
10f50 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
10f60 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
10f70 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
10f80 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  p it. */.  if( p
10f90 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b  File->hShared ){
10fa0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
10fb0 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
10fc0 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
10fd0 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
10fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49  .             FI
10ff0 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45  LE_MAP_READ|FILE
11000 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30  _MAP_WRITE, 0, 0
11010 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
11020 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ck));.    /* If 
11030 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20  mapping failed, 
11040 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64  close the shared
11050 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61   memory handle a
11060 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20  nd erase it */. 
11070 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73     if( !pFile->s
11080 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70  hared ){.      p
11090 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
110a0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
110b0 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  ();.      winLog
110c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
110d0 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
110e0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
110f0 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
11100 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
11110 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c  ename);.      bL
11120 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  ogged = TRUE;.  
11130 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
11140 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
11150 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11160 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a  hShared = NULL;.
11170 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11180 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  If shared memory
11190 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72   could not be cr
111a0 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73  eated, then clos
111b0 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
111c0 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46  fail */.  if( pF
111d0 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55  ile->hShared==NU
111e0 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62  LL ){.    if( !b
111f0 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20  Logged ){.      
11200 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11210 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
11220 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
11230 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
11240 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
11270 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck3", zFilename)
11280 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
11290 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
112a0 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
112b0 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
112c0 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
112d0 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
112e0 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
112f0 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
11300 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11310 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20  E_IOERR;.  }..  
11320 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11330 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
11340 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65  if we're suppose
11350 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49  d to */.  if( bI
11360 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  nit ){.    memse
11370 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c  t(pFile->shared,
11380 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
11390 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77  Lock));.  }..  w
113a0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
113b0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
113c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
113d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
113e0 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f  stroy the part o
113f0 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64  f winFile that d
11400 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20  eals with wince 
11410 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20  locks.*/.static 
11420 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f  void winceDestro
11430 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  yLock(winFile *p
11440 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69  File){.  if (pFi
11450 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
11460 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
11470 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
11480 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
11490 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
114a0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
114b0 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75  wing blocks shou
114c0 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65  ld probably asse
114d0 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65  rt in debug mode
114e0 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20  , but they.     
114f0 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70    are to cleanup
11500 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63   in case any loc
11510 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e  ks remained open
11520 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
11530 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
11540 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  s){.      pFile-
11550 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11560 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s --;.    }.    
11570 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11580 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20  .bReserved){.   
11590 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
115a0 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
115b0 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
115c0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
115d0 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
115e0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
115f0 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
11600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
11610 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
11620 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
11630 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11640 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
11650 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
11660 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e   De-reference an
11670 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79  d close our copy
11680 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d   of the shared m
11690 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a  emory handle */.
116a0 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f      osUnmapViewO
116b0 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61  fFile(pFile->sha
116c0 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  red);.    osClos
116d0 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
116e0 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
116f0 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
11700 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
11710 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
11720 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
11730 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
11740 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11750 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
11760 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
11770 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
11780 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11790 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
117a0 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
117b0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
117c0 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
117d0 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
117e0 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
117f0 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
11800 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
11810 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
11820 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
11830 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
11840 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
11850 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
11860 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
11870 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
11880 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
11890 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
118a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
118b0 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
118c0 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
118d0 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
118e0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
118f0 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
11900 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
11910 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
11920 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
11930 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
11940 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
11950 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
11960 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
11970 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11980 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
11990 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
119a0 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
119b0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
119c0 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
119d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
119e0 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
119f0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11a00 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
11a10 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
11a20 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
11a30 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
11a40 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
11a50 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
11a60 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
11a70 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11a80 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
11a90 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
11aa0 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11ab0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11ac0 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
11ad0 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
11ae0 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
11af0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
11b00 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11b10 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
11b20 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
11b30 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
11b40 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
11b50 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11b60 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
11b70 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11b80 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
11b90 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
11ba0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11bb0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11bc0 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
11bd0 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
11be0 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11bf0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11c00 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
11c10 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
11c20 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
11c30 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
11c40 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
11c50 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
11c60 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
11c70 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
11c80 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
11c90 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
11ca0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
11cb0 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
11cc0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
11cd0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
11ce0 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
11cf0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11d00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11d10 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
11d20 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
11d30 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11d40 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11d50 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
11d60 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
11d70 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
11d80 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
11d90 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
11da0 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
11db0 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
11dc0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
11dd0 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
11de0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
11df0 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
11e00 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
11e10 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
11e20 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
11e30 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11e40 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
11e50 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
11e60 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
11e70 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
11e80 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
11e90 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
11ea0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
11eb0 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
11ec0 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
11ed0 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
11ee0 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
11ef0 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
11f00 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
11f10 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
11f20 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
11f30 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
11f40 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
11f50 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
11f60 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
11f70 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
11f80 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
11f90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11fa0 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
11fb0 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
11fc0 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
11fd0 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
11fe0 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
11ff0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
12000 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
12010 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
12020 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
12030 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
12040 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
12050 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12060 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
12070 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12080 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
12090 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
120a0 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
120b0 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
120c0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
120d0 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
120e0 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
120f0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
12100 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
12110 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
12120 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
12130 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
12140 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
12150 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
12160 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
12170 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12180 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
12190 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
121a0 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
121b0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
121c0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
121d0 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
121e0 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
121f0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
12200 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
12210 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
12220 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
12230 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
12240 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
12250 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12260 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
12270 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
12280 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
12290 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
122a0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
122b0 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
122c0 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
122d0 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
122e0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
122f0 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
12300 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
12310 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
12320 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
12330 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
12340 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12350 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12360 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12370 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
12380 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
12390 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
123a0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
123b0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
123c0 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
123d0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
123e0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
123f0 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
12400 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
12410 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
12420 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
12430 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
12440 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
12450 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12460 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12470 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12480 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12490 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
124a0 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
124b0 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
124c0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
124d0 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
124e0 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
124f0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
12500 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
12510 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
12520 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
12530 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
12540 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
12550 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
12560 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
12570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125b0 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
125c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
125d0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
125e0 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
125f0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
12600 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
12610 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
12620 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
12630 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
12640 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
12650 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
12660 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
12670 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
12680 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12690 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
126a0 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
126b0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
126c0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
126d0 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
126e0 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
126f0 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
12700 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
12710 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
12720 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
12730 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
12750 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
12760 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
12770 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
12780 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
12790 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
127a0 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
127b0 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
127c0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
127d0 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
127e0 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
127f0 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
12800 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
12810 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
12820 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79   flags, 0, numBy
12830 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
12840 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
12850 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
12860 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68  n osLockFile(*ph
12870 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
12880 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
12890 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
128c0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
128d0 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  ** Unlock a file
128e0 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61   region.. */.sta
128f0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f  tic BOOL winUnlo
12900 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
12910 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
12920 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
12930 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
12940 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
12950 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
12960 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
12970 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12980 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
12990 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
129a0 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
129b0 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
129c0 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
129d0 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
129e0 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20  PI UnlockFile.. 
129f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
12a00 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46  ceUnlockFile(phF
12a10 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
12a20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20  offsetHigh,.    
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
12a50 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
12a60 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
12a70 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
12a80 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
12a90 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
12aa0 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
12ab0 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
12ac0 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
12ad0 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
12ae0 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
12af0 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
12b00 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  n osUnlockFileEx
12b10 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d  (*phFile, 0, num
12b20 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
12b30 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
12b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
12b50 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
12b60 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
12b70 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
12b80 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
12bb0 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
12bc0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
12bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c10 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
12c20 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
12c30 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
12c40 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
12c50 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
12c60 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
12c70 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
12c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12cc0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
12cd0 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
12ce0 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
12cf0 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
12d00 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
12d10 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
12d20 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
12d30 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
12d40 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
12d50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
12d60 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
12d70 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
12d80 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
12d90 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  ed as the first.
12da0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  ** argument to o
12db0 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69  ffset iOffset wi
12dc0 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  thin the file. I
12dd0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
12de0 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72  turn 0..** Other
12df0 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
12e00 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
12e10 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
12e20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12e30 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c  nSeekFile(winFil
12e40 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
12e50 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
12e60 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
12e70 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
12e80 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
12e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
12ea0 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
12eb0 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
12ec0 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
12ef0 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
12f00 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
12f10 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
12f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12f30 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
12f40 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
12f50 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
12f60 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
12f70 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
12f80 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
12f90 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f  tError() */..  O
12fa0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12fb0 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
12fc0 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
12fd0 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75   iOffset));..  u
12fe0 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
12ff0 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
13000 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
13010 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
13020 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
13030 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
13040 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
13050 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
13060 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
13070 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20 2a  urns a dword.  *
13080 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
13090 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
130a0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
130b0 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
130c0 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
130d0 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
130e0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
130f0 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
13100 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a  ing to MSDN,.  *
13110 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
13120 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
13130 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
13140 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
13150 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20   determine.  ** 
13160 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
13170 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
13180 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
13190 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
131a0 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73  call.  ** GetLas
131b0 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
131c0 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
131d0 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
131e0 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
131f0 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
13200 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
13210 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
13220 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
13230 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
13240 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
13250 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
13260 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
13270 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
13280 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
13290 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
132a0 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
132b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
132d0 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
132e0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
132f0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
13300 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13310 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
13320 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13330 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
13340 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
13350 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
13360 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
13370 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
13380 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
13390 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
133a0 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
133b0 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
133c0 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
133d0 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
133e0 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
133f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13400 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
13410 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
13440 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
13450 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
13460 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
13470 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
13480 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
13490 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
134a0 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
134b0 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
134c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
134d0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
134e0 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
134f0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
13500 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
13510 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
13520 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
13530 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
13540 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
13550 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
13560 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13570 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
13580 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13590 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
135a0 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
135b0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
135c0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
135d0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
135e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
135f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
13600 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
13610 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
13620 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
13630 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
13640 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
13650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13660 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
13670 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
13680 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
13690 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
136a0 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
136b0 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
136c0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
136d0 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
136e0 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
136f0 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
13700 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
13710 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
13720 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
13730 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
13740 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
13750 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
13760 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
13770 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
13780 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
13790 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
137a0 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
137b0 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
137c0 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
137d0 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
137e0 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
137f0 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
13800 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
13810 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
13820 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
13830 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
13840 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
13850 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
13860 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
13870 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
13880 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
13890 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
138a0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
138b0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
138c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
138d0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
138e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
138f0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
13900 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
13910 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13920 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
13930 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
13940 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
13950 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
13960 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
13970 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20  p, file=%p\n",. 
13980 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13990 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
139a0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
139b0 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  >h));..#if SQLIT
139c0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
139d0 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  0.  winUnmapfile
139e0 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
139f0 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
13a00 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
13a10 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
13a20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13a30 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
13a40 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
13a50 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
13a60 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
13a70 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
13a80 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  & (sqlite3_win32
13a90 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  _sleep(100), 1) 
13aa0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
13ab0 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57  _WINCE.#define W
13ac0 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
13ad0 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65  TEMPTS 3.  wince
13ae0 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c  DestroyLock(pFil
13af0 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e);.  if( pFile-
13b00 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
13b10 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
13b20 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20   0;.    while(. 
13b30 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65            osDele
13b40 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a  teFileW(pFile->z
13b50 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d  DeleteOnClose)==
13b60 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73 47  0.        && osG
13b70 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
13b80 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
13b90 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66  OnClose)!=0xffff
13ba0 66 66 66 66 0a 20 20 20 20 20 20 20 20 26 26 20  ffff.        && 
13bb0 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45  cnt++ < WINCE_DE
13bc0 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a  LETION_ATTEMPTS.
13bd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
13be0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
13bf0 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74  p(100);  /* Wait
13c00 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65   a little before
13c10 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f   trying again */
13c20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13c30 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a  e3_free(pFile->z
13c40 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a  DeleteOnClose);.
13c50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
13c60 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
13c70 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
13c80 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
13c90 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  );.  OSTRACE(("C
13ca0 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  LOSE pid=%lu, pF
13cb0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
13cc0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
13cd0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
13ce0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
13cf0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
13d00 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
13d10 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
13d20 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a   rc ? SQLITE_OK.
13d30 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69              : wi
13d40 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
13d50 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73  _IOERR_CLOSE, os
13d60 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c            "winCl
13d90 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
13da0 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
13db0 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
13dc0 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
13dd0 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
13de0 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
13df0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
13e00 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
13e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
13e20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
13e30 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
13e40 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
13e50 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
13e60 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
13e70 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
13e80 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
13e90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13ea0 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
13eb0 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
13ec0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13ef0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
13f00 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
13f10 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
13f20 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
13f30 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
13f40 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
13f50 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
13f60 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
13f70 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
13f80 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76  .  OVERLAPPED ov
13f90 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
13fa0 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
13fb0 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a   for ReadFile. *
13fc0 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  /.#endif.  winFi
13fd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
13fe0 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
13ff0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
14000 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
14030 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
14040 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69  from file */.  i
14050 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20  nt nRetry = 0;  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14070 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72  * Number of retr
14080 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ys */..  assert(
14090 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
140a0 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
140b0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
140c0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
140d0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
140e0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
140f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
14100 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14110 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75  =%p, file=%p, bu
14120 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
14130 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
14140 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c   "offset=%lld, l
14150 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74  ock=%d\n", osGet
14160 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14170 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
14180 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
14190 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
141a0 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
141b0 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
141c0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
141d0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
141e0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
141f0 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
14200 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
14210 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
14220 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
14230 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
14240 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
14250 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
14260 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
14270 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
14280 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
14290 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
142a0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
142b0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
142c0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
142d0 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
142e0 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50  RACE(("READ-MMAP
142f0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
14300 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
14310 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
14330 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14340 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14350 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
14360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14380 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
14390 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
143a0 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
143b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
143c0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
143d0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
143e0 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
143f0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
14400 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
14410 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
14420 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
14430 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
14440 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14450 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
14460 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  NCE || defined(S
14470 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
14480 56 45 52 4c 41 50 50 45 44 29 0a 20 20 69 66 28  VERLAPPED).  if(
14490 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
144a0 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20  le, offset) ){. 
144b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
144c0 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
144d0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
144e0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
144f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
14500 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14510 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
14520 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14530 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
14540 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21  ;.  }.  while( !
14550 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
14560 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
14570 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65  &nRead, 0) ){.#e
14580 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  lse.  memset(&ov
14590 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
145a0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
145b0 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
145c0 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
145d0 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
145e0 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  ff);.  overlappe
145f0 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
14600 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
14610 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
14620 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  ;.  while( !osRe
14630 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
14640 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
14650 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  ad, &overlapped)
14660 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47   &&.         osG
14670 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45  etLastError()!=E
14680 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20  RROR_HANDLE_EOF 
14690 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57  ){.#endif.    DW
146a0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
146b0 20 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49     if( winRetryI
146c0 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c  oerr(&nRetry, &l
146d0 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74  astErrno) ) cont
146e0 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d  inue;.    pFile-
146f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
14700 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52  tErrno;.    OSTR
14710 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
14720 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
14730 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
14740 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a  _IOERR_READ\n",.
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
14760 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14770 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14780 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
14790 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
147a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
147b0 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  D, pFile->lastEr
147c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
147d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
147e0 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Read", pFile->zP
147f0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c  ath);.  }.  winL
14800 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20  ogIoerr(nRetry, 
14810 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28  __LINE__);.  if(
14820 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d   nRead<(DWORD)am
14830 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65  t ){.    /* Unre
14840 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
14850 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
14860 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
14870 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
14880 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20  *)pBuf)[nRead], 
14890 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20  0, amt-nRead);. 
148a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
148b0 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
148c0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
148d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
148e0 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20  ORT_READ\n",.   
148f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
14900 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
14910 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
14920 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
14930 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
14940 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ORT_READ;.  }.. 
14950 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
14960 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14970 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14980 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
14990 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
149a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
149b0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
149c0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
149d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
149e0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
149f0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
14a00 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
14a10 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
14a20 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
14a30 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
14a40 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
14a50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
14a60 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
14a70 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
14a80 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
14a90 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
14aa0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
14ab0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
14ac0 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
14ad0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
14ae0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
14b10 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
14b20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
14b30 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
14b40 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
14b50 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
14b60 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
14b70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
14b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14b90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14ba0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
14bb0 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
14bc0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
14bd0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
14be0 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
14bf0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  dle */.  int nRe
14c00 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
14c10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14c20 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f  er of retries */
14c30 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ..  assert( amt>
14c40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14c50 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
14c60 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
14c70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
14c80 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
14c90 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
14ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
14cb0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
14cc0 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
14cd0 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14ce0 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
14cf0 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  unt=%d, ".      
14d00 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c       "offset=%ll
14d10 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f  d, lock=%d\n", o
14d20 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14d30 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
14d40 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14d50 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
14d60 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
14d70 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 64  cktype));..#if d
14d80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d  efined(SQLITE_MM
14d90 41 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26  AP_READWRITE) &&
14da0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
14db0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
14dc0 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
14dd0 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
14de0 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
14df0 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
14e00 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
14e10 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
14e20 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
14e30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
14e40 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
14e50 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
14e60 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
14e70 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
14e80 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
14e90 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
14ea0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
14eb0 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
14ec0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
14ed0 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75  ITE-MMAP pid=%lu
14ee0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14ef0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
14f00 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
14f10 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
14f20 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
14f30 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
14f40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14f50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
14f60 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
14f70 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
14f80 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
14f90 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
14fa0 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
14fb0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
14fc0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
14fd0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
14fe0 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
14ff0 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
15000 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
15010 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
15020 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
15030 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
15040 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64  TE_OS_WINCE || d
15050 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
15060 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
15070 44 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65  D).  rc = winSee
15080 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
15090 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
150a0 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23  0 ){.#else.  {.#
150b0 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
150c0 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
150d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
150e0 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
150f0 44 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  D).    OVERLAPPE
15100 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
15110 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
15120 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
15130 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
15140 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
15150 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
15160 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
15170 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
15180 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
151b0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
151c0 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
151d0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
151e0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
151f0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
15200 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
15210 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
15220 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
15230 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
15240 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
15250 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
15260 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
15270 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
15280 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
15290 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d  VERLAPPED).    m
152a0 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
152b0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
152c0 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
152d0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
152e0 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
152f0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
15300 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
15310 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
15320 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
15330 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
15340 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65  endif..    while
15350 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20  ( nRem>0 ){.#if 
15360 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15370 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15380 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
15390 41 50 50 45 44 29 0a 20 20 20 20 20 20 69 66 28  APPED).      if(
153a0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
153b0 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
153c0 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
153d0 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
153e0 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
153f0 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
15400 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
15410 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
15420 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
15430 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
15440 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72  &nRetry, &lastEr
15450 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rno) ) continue;
15460 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
15480 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20  sert( nWrite==0 
15490 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52  || nWrite<=(DWOR
154a0 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20  D)nRem );.      
154b0 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  if( nWrite==0 ||
154c0 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e   nWrite>(DWORD)n
154d0 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Rem ){.        l
154e0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
154f0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
15500 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15510 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
15520 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
15530 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
15540 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
15550 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
15560 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
15570 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
15580 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
15590 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
155a0 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
155b0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
155c0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
155d0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
155e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
155f0 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
15600 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
15610 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
15620 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
15630 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15640 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
15650 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
15660 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
15670 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
15680 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15690 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
156a0 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
156b0 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
156c0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
156d0 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
156e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
156f0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ITE pid=%lu, pFi
15700 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
15710 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
15720 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15730 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
15740 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15750 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15760 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
15770 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55  gError(SQLITE_FU
15780 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  LL, pFile->lastE
15790 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
157b0 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c  winWrite1", pFil
157c0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
157d0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57  .    OSTRACE(("W
157e0 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  RITE pid=%lu, pF
157f0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
15800 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
15810 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20  _WRITE\n",.     
15820 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15830 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15840 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15850 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
15860 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15870 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
15880 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
15890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
158a0 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
158b0 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
158c0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
158d0 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
158e0 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  try, __LINE__);.
158f0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
15900 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
15910 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15920 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
15930 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
15940 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15950 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15960 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
15970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15980 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
15990 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
159a0 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
159b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
159c0 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
159d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
159e0 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
159f0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
15a00 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
15a10 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
15a20 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
15a30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15a40 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
15a50 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
15a60 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
15a70 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
15a80 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  Errno;..  assert
15a90 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
15aa0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
15ab0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15ac0 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53  _TRUNCATE);.  OS
15ad0 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
15ae0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
15af0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a  %p, file=%p, siz
15b00 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c  e=%lld, lock=%d\
15b10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
15b20 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15b30 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15b40 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
15b50 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
15b60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15b70 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
15b80 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
15b90 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
15ba0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
15bb0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
15bc0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
15bd0 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
15be0 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
15bf0 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
15c00 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
15c10 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
15c20 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
15c30 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
15c40 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
15c50 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
15c60 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
15c70 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
15c80 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
15c90 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
15ca0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
15cb0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hunk;.  }..  /* 
15cc0 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72  SetEndOfFile() r
15cd0 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
15ce0 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c  when successful,
15cf0 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74   or zero when it
15d00 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28   fails. */.  if(
15d10 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
15d20 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  le, nByte) ){.  
15d30 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
15d40 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
15d50 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
15d60 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c   "winTruncate1",
15d90 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
15da0 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f    }else if( 0==o
15db0 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46  sSetEndOfFile(pF
15dc0 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20  ile->h) &&.     
15dd0 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72         ((lastErr
15de0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
15df0 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53  ror())!=ERROR_US
15e00 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20  ER_MAPPED_FILE) 
15e10 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
15e20 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
15e30 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  rno;.    rc = wi
15e40 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15e50 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
15e60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15e70 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15e80 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
15e90 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate2", pFile->z
15ea0 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  Path);.  }..#if 
15eb0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
15ec0 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74  SIZE>0.  /* If t
15ed0 68 65 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e  he file was trun
15ee0 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
15ef0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
15f00 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
15f10 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72  mapped region, r
15f20 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
15f30 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  ive mapping size
15f40 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65   as well. SQLite
15f50 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72   will.  ** use r
15f60 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28  ead() and write(
15f70 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  ) to access data
15f80 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69   beyond this poi
15f90 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a  nt from now on..
15fa0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
15fb0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20  ->pMapRegion && 
15fc0 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
15fd0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69  pSize ){.    pFi
15fe0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
15ff0 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Byte;.  }.#endif
16000 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ..  OSTRACE(("TR
16010 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  UNCATE pid=%lu, 
16020 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
16030 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
16040 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16050 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16060 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16070 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16080 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
16090 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
160a0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
160b0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
160c0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
160d0 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
160e0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
160f0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
16100 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
16110 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
16120 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
16130 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
16140 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
16150 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
16160 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
16170 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
16180 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
16190 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
161a0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
161b0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
161c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
161d0 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
161e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
161f0 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
16200 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
16210 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
16220 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
16230 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
16240 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
16250 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
16260 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
16270 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
16280 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
16290 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53   \.    defined(S
162a0 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
162b0 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  ACE).  /*.  ** U
162c0 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
162d0 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
162e0 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
162f0 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
16300 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
16310 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
16320 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
16330 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
16340 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
16350 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
16360 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
16370 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
16380 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
16390 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
163a0 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
163b0 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
163c0 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
163d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
163e0 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
163f0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
16400 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
16410 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
16420 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
16430 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
16440 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
16450 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
16460 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
16470 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
16480 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
16490 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
164a0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
164b0 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
164c0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
164d0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
164e0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
164f0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61  %p, file=%p, fla
16500 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  gs=%x, lock=%d\n
16510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
16520 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
16530 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
16540 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20  ile->h, flags,. 
16550 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16560 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
16570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  fndef SQLITE_TES
16580 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  T.  UNUSED_PARAM
16590 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c  ETER(flags);.#el
165a0 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26  se.  if( (flags&
165b0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
165c0 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
165d0 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
165e0 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
165f0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
16600 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
16610 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
16620 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
16630 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
16640 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
16650 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
16660 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
16670 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45  O_SYNC.  OSTRACE
16680 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d  (("SYNC-NOP pid=
16690 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
166a0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
166b0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
166c0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
166d0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
166e0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
166f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16700 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53 51  OK;.#else.#if SQ
16710 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
16720 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65  ZE>0.  if( pFile
16730 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
16740 20 20 20 20 69 66 28 20 6f 73 46 6c 75 73 68 56      if( osFlushV
16750 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
16760 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29 20  >pMapRegion, 0) 
16770 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
16780 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64  (("SYNC-MMAP pid
16790 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
167a0 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
167b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
167c0 22 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22  "rc=SQLITE_OK\n"
167d0 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
167e0 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20  ocessId(),.     
167f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c            pFile,
16800 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
16810 6f 6e 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  on));.    }else{
16820 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
16830 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
16840 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
16850 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16860 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  -MMAP pid=%lu, p
16870 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
16880 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
16890 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
168a0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
168b0 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
168c0 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20  rocessId(),.    
168d0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
168e0 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
168f0 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
16900 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
16910 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
16920 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
16930 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16950 69 6e 53 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d  inSync1", pFile-
16960 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
16970 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d   }.#endif.  rc =
16980 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
16990 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
169a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
169b0 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
169c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53  if( rc ){.    OS
169d0 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64  TRACE(("SYNC pid
169e0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
169f0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16a00 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
16a10 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16a20 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16a30 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
16a40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16a50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
16a60 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
16a70 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16a80 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f  stError();.    O
16a90 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69  STRACE(("SYNC pi
16aa0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16ab0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16ac0 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c  ITE_IOERR_FSYNC\
16ad0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
16ae0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16af0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16b00 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16b10 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16b20 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16b30 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
16b40 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 20 22 77 69 6e 53 79 6e 63 32 22 2c 20 70 46 69   "winSync2", pFi
16b70 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
16b80 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
16b90 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
16ba0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
16bb0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
16bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
16bd0 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
16be0 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
16bf0 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
16c00 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16c10 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16c20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16c30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
16c40 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
16c50 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
16c60 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
16c70 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
16c80 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
16c90 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
16ca0 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
16cb0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
16cc0 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
16cd0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
16ce0 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
16cf0 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
16d00 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
16d10 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
16d20 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
16d30 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
16d40 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
16d70 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
16d80 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
16d90 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
16da0 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
16db0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
16dc0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16dd0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16de0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
16df0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
16e00 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
16e10 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e30 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
16e40 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16e50 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
16e60 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
16e70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
16e80 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
16e90 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
16ea0 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
16eb0 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
16ec0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
16ed0 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
16ee0 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
16ef0 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
16f00 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
16f10 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
16f20 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
16f30 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
16f40 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
16f50 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
16f60 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
16f70 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
16f80 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16f90 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
16fa0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
16fb0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
16fc0 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
16fd0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16ff0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
17000 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
17010 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
17020 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
17030 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
17040 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72  , *pSize=%lld, r
17050 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
17060 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53      pFile->h, pS
17070 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c  ize, *pSize, sql
17080 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
17090 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
170a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
170b0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
170c0 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
170d0 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
170e0 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
170f0 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
17100 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
17110 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
17120 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
17130 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   1.#endif..#ifnd
17140 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ef LOCKFILE_EXCL
17150 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66  USIVE_LOCK.# def
17160 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  ine LOCKFILE_EXC
17170 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65  LUSIVE_LOCK 2.#e
17180 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74  ndif../*.** Hist
17190 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65  orically, SQLite
171a0 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74   has used both t
171b0 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20  he LockFile and 
171c0 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
171d0 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  ions..** When th
171e0 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74  e LockFile funct
171f0 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74  ion was used, it
17200 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65   was always expe
17210 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20  cted to fail.** 
17220 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
17230 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  he lock could no
17240 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20  t be obtained.  
17250 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20  Also, it always 
17260 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f  expected to.** o
17270 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
17280 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20  ve lock.  These 
17290 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77  flags are used w
172a0 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  ith the LockFile
172b0 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  Ex function.** a
172c0 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65  nd reflect those
172d0 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74   expectations; t
172e0 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73  herefore, they s
172f0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61  hould not be cha
17300 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nged..*/.#ifndef
17310 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17320 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
17330 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
17340 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c  FLAGS   (LOCKFIL
17350 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
17360 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20  LY | \.         
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c           LOCKFIL
17390 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
173a0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
173b0 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74  Currently, SQLit
173c0 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68  e never calls th
173d0 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
173e0 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61  ction without wa
173f0 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c  nting the.** cal
17400 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69  l to fail immedi
17410 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
17420 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
17430 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
17440 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17450 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  EX_FLAGS.# defin
17460 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
17470 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46  EEX_FLAGS (LOCKF
17480 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
17490 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TELY).#endif../*
174a0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
174b0 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
174c0 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
174d0 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
174e0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
174f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
17500 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20  .** is Win9x or 
17510 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
17520 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c   int winGetReadL
17530 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
17540 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
17550 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
17560 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
17570 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
17580 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17590 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
175a0 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
175b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
175c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
175d0 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
175e0 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
175f0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
17600 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
17610 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
17620 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
17630 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
17640 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
17650 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
17660 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
17670 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
17680 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
17690 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
176a0 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
176b0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
176c0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
176d0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
176e0 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
176f0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
17700 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
17710 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
17720 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
17730 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
17740 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
17750 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
17760 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
17770 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
17780 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
17790 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
177a0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
177b0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
177c0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
177d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
177e0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
177f0 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
17800 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
17810 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
17820 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
17830 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
17840 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17850 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
17860 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
17870 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
17880 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52  ck */.  }.  OSTR
17890 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
178a0 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
178b0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
178c0 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e   res));.  return
178d0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
178e0 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
178f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17900 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
17910 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
17920 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
17930 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
17940 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
17950 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
17960 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
17970 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17980 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
17990 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
179a0 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
179b0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
179c0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
179d0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
179e0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
179f0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
17a00 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
17a10 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
17a20 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
17a30 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
17a40 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
17a50 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
17a60 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
17a70 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
17a80 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
17a90 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
17aa0 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
17ab0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
17ac0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
17ad0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
17ae0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
17af0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17b00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
17b10 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61     "winUnlockRea
17b20 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
17b30 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  Path);.  }.  OST
17b40 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f  RACE(("READ-UNLO
17b50 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
17b60 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
17b70 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
17b80 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
17b90 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
17ba0 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
17bb0 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
17bc0 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
17bd0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
17be0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
17bf0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
17c00 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
17c10 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
17c20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
17c30 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
17c40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
17c50 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
17c60 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
17c70 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
17c80 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
17c90 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
17ca0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
17cb0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
17cc0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
17cd0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
17ce0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
17cf0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
17d00 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
17d10 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
17d20 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
17d30 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
17d40 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
17d50 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
17d60 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
17d70 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
17d80 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
17d90 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
17da0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
17db0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
17dc0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
17dd0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
17de0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
17df0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
17e00 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
17e10 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
17e20 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
17e30 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17e40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17e50 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
17e60 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
17e70 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75   winUnlock() rou
17e80 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61  tine.** erases a
17e90 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65  ll locks at once
17ea0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20   and returns us 
17eb0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c  immediately to l
17ec0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
17ed0 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
17ee0 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74  sible to lower t
17ef0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17f00 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74   one step at a t
17f10 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73  ime.  You.** mus
17f20 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f  t go straight to
17f30 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
17f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17f50 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  winLock(sqlite3_
17f60 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
17f70 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
17f80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
17f90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
17fa0 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
17fb0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  s */.  int res =
17fc0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
17fd0 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e   Result of a Win
17fe0 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a  dows lock call *
17ff0 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74  /.  int newLockt
18000 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ype;       /* Se
18010 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  t pFile->locktyp
18020 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
18030 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
18040 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
18050 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
18060 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
18070 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
18080 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
18090 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
180a0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
180b0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
180c0 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20   = NO_ERROR;..  
180d0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
180e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
180f0 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
18100 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
18110 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
18120 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
18130 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
18140 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
18150 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
18160 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
18170 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
18180 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
18190 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
181a0 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
181b0 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
181c0 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
181d0 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
181e0 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
181f0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
18200 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
18210 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
18220 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
18230 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
18240 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
18250 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69  E(("LOCK-HELD fi
18260 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18270 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18280 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
18290 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
182a0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
182b0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72 69   any kind of wri
182c0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61  te-lock on a rea
182d0 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a  d-only database.
182e0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
182f0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  e->ctrlFlags & W
18300 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d  INFILE_RDONLY)!=
18310 30 20 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52  0 && locktype>=R
18320 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
18330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18340 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
18350 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
18360 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
18370 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
18380 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
18390 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
183a0 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
183b0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
183c0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
183d0 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
183e0 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
183f0 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
18400 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
18410 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
18420 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
18430 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
18440 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
18450 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
18460 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
18470 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
18480 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
18490 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
184a0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
184b0 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
184c0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
184d0 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
184e0 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
184f0 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
18500 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18510 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65  ;.  if(   (pFile
18520 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
18530 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20  OCK).     || (  
18540 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
18550 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20  USIVE_LOCK).    
18560 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e       && (pFile->
18570 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
18580 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
18590 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
185a0 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
185b0 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e  >0 && (res = win
185c0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
185d0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
185e0 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
18620 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
18630 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33  {.      /* Try 3
18640 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68   times to get th
18650 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20  e pending lock. 
18660 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
18670 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a  to work.      **
18680 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
18690 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78   caused by index
186a0 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d  ing and/or anti-
186b0 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f  virus software o
186c0 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f  n.      ** Windo
186d0 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  ws systems..    
186e0 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20    ** If you are 
186f0 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20  using this code 
18700 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61  as a model for a
18710 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73  lternative VFSes
18720 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  , do not.      *
18730 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72  * copy this retr
18740 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20  y logic.  It is 
18750 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20  a hack intended 
18760 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
18770 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18780 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
18790 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
187a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c       OSTRACE(("L
187b0 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c  OCK-PENDING-FAIL
187c0 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d   file=%p, count=
187d0 25 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22  %d, result=%d\n"
187e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
187f0 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20   pFile->h, cnt, 
18800 72 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28  res));.      if(
18810 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
18820 52 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  R_INVALID_HANDLE
18830 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
18840 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
18850 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
18860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
18870 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
18880 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
18890 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63  -FAIL file=%p, c
188a0 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  ount=%d, rc=%s\n
188b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
188c0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e      pFile->h, cn
188d0 74 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  t, sqlite3ErrNam
188e0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
188f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18900 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e    }.      if( cn
18910 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t ) sqlite3_win3
18920 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20  2_sleep(1);.    
18930 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
18940 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
18950 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
18960 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
18970 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
18980 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18990 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
189a0 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
189b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
189c0 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
189d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
189e0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
189f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
18a00 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63   = winGetReadLoc
18a10 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  k(pFile);.    if
18a20 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
18a30 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
18a40 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
18a50 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
18a60 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18a70 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
18a80 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
18a90 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
18aa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
18ab0 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
18ac0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
18ad0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18ae0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
18af0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
18b00 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
18b10 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
18b20 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
18b30 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
18b40 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
18b50 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
18b60 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45  newLocktype = RE
18b70 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SERVED_LOCK;.   
18b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
18b90 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
18ba0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
18bb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
18bc0 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
18bd0 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
18be0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
18bf0 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
18c00 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  .    newLocktype
18c10 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
18c20 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
18c30 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ock = 0;.  }..  
18c40 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
18c50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a  CLUSIVE lock.  *
18c60 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
18c70 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18c80 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
18c90 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
18ca0 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  cktype>=SHARED_L
18cb0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
18cc0 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
18cd0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72  ck(pFile);.    r
18ce0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
18cf0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
18d00 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
18d10 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
18d20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
18d30 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
18d40 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
18d50 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
18d60 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
18d70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
18d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
18d90 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
18da0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
18db0 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63     winGetReadLoc
18dc0 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  k(pFile);.    }.
18dd0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
18de0 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45  are holding a PE
18df0 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20  NDING lock that 
18e00 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65  ought to be rele
18e10 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ased, then.  ** 
18e20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  release it now..
18e30 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65    */.  if( gotPe
18e40 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63  ndingLock && loc
18e50 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
18e60 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
18e70 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
18e80 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
18e90 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
18ea0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
18eb0 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
18ec0 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
18ed0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
18ee0 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
18ef0 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
18f00 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
18f10 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
18f20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18f30 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
18f40 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
18f50 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
18f60 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18f70 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41  _BUSY;.    OSTRA
18f80 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66  CE(("LOCK-FAIL f
18f90 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25  ile=%p, wanted=%
18fa0 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20  d, got=%d\n",.  
18fb0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18fc0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e  ->h, locktype, n
18fd0 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ewLocktype));.  
18fe0 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
18ff0 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63  ype = (u8)newLoc
19000 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
19010 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
19020 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
19030 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
19040 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
19050 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
19060 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
19070 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19080 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19090 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
190a0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
190b0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
190c0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
190d0 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
190e0 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
190f0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
19100 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
19110 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74  .** non-zero, ot
19120 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f  herwise zero..*/
19130 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
19140 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19150 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19160 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
19170 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77  {.  int res;.  w
19180 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
19190 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
191a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
191b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
191c0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
191d0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53  VEDLOCK; );.  OS
191e0 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
191f0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52  LOCK file=%p, pR
19200 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69  esOut=%p\n", pFi
19210 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29  le->h, pResOut))
19220 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
19230 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
19240 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
19250 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
19260 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f    res = 1;.    O
19270 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
19280 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
19290 65 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29  esult=%d (local)
192a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
192b0 65 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  es));.  }else{. 
192c0 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
192d0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
192e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
192f0 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44  X_FLAGS,RESERVED
19300 5f 42 59 54 45 2c 30 2c 31 2c 30 29 3b 0a 20 20  _BYTE,0,1,0);.  
19310 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
19320 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
19330 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
19340 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
19350 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
19360 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f  es = !res;.    O
19370 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
19380 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
19390 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65  esult=%d (remote
193a0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
193b0 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  res));.  }.  *pR
193c0 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f  esOut = res;.  O
193d0 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
193e0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
193f0 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
19400 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
19410 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
19420 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52      pFile->h, pR
19430 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
19440 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19450 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19460 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
19470 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
19480 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f  descriptor id to
19490 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
194a0 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
194b0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
194c0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
194d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
194e0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
194f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19500 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
19510 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
19520 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
19530 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
19540 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
19550 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
19560 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
19570 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61  is routine to fa
19580 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  il if the second
19590 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
195a0 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65  NO_LOCK.  If the
195b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
195c0 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   is SHARED_LOCK 
195d0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
195e0 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  e.** might retur
195f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
19600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
19610 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nUnlock(sqlite3_
19620 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
19630 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
19640 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ype;.  winFile *
19650 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
19660 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
19670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
19680 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
19690 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
196a0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
196b0 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  K );.  OSTRACE((
196c0 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
196d0 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
196e0 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
196f0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19700 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
19710 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
19720 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
19730 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20  ktype));.  type 
19740 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
19750 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
19760 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
19770 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
19780 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
19790 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
197a0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
197b0 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
197c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
197d0 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b   !winGetReadLock
197e0 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
197f0 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
19800 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
19810 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
19820 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
19830 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
19840 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
19850 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
19860 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
19870 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
19880 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c      "winUnlock",
198b0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
198c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
198d0 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
198e0 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
198f0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
19900 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
19910 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
19920 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
19930 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
19940 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
19950 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  .    winUnlockRe
19960 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
19970 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
19980 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
19990 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
199a0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
199b0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
199c0 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
199d0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
199e0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
199f0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
19a00 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
19a10 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
19a20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
19a30 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
19a40 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
19a50 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
19a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
19a70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  Arg is initially
19a80 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
19a90 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
19aa0 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
19ab0 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
19ac0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
19ad0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
19ae0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
19af0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
19b00 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
19b10 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
19b20 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
19b30 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
19b40 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
19b50 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74   void winModeBit
19b60 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
19b70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
19b80 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
19b90 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
19ba0 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
19bb0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
19bc0 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
19bd0 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
19be0 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
19bf0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
19c00 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
19c10 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
19c20 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
19c30 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
19c40 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
19c50 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75  helper methods u
19c60 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  sed for temporar
19c70 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69  y files */.stati
19c80 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
19c90 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
19ca0 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74   *, char **);.st
19cb0 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69  atic int winIsDi
19cc0 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b  r(const void *);
19cd0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
19ce0 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
19cf0 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72  Colon(const char
19d00 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   *);../*.** Cont
19d10 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
19d20 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
19d30 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
19d40 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
19d50 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
19d60 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
19d70 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
19d80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
19d90 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53  inFile*)id;.  OS
19da0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19db0 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41  le=%p, op=%d, pA
19dc0 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  rg=%p\n", pFile-
19dd0 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a  >h, op, pArg));.
19de0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
19df0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19e00 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
19e10 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
19e20 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
19e30 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53  cktype;.      OS
19e40 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19e50 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
19e60 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
19e70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
19e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19e90 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
19ea0 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52  E_FCNTL_LAST_ERR
19eb0 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
19ec0 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70  t*)pArg = (int)p
19ed0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
19ee0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
19ef0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
19f00 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
19f10 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
19f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19f30 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
19f40 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
19f50 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
19f60 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
19f70 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
19f80 72 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  rg;.      OSTRAC
19f90 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19fa0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
19fb0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
19fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19fd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19fe0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19ff0 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1a000 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
1a010 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1a020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
1a030 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
1a040 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1a050 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
1a060 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
1a070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a080 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1a090 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
1a0a0 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
1a0b0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
1a0c0 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
1a0d0 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
1a0e0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a0f0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1a100 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
1a110 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
1a120 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
1a130 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a140 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1a150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a160 7d 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  }.        OSTRAC
1a170 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1a180 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
1a190 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
1a1a0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1a1b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1a1d0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a1e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1a1f0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1a200 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1a210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a220 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1a230 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
1a240 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
1a250 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
1a260 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
1a270 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
1a280 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1a290 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1a2a0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1a2b0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1a2c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a2d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1a2e0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1a2f0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a300 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
1a310 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
1a320 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
1a330 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1a340 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a350 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1a360 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1a370 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1a380 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a390 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1a3a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1a3b0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1a3c0 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1a3d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1a3e0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1a3f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54  Name);.      OST
1a400 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1a410 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1a420 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1a430 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1a450 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1a460 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
1a470 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69  RETRY: {.      i
1a480 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41  nt *a = (int*)pA
1a490 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  rg;.      if( a[
1a4a0 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0]>0 ){.        
1a4b0 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
1a4c0 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
1a4d0 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
1a4e0 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b  = winIoerrRetry;
1a4f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a500 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
1a510 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
1a520 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
1a530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a540 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49       a[1] = winI
1a550 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
1a560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1a570 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a580 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1a590 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1a5a0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1a5b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a5c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1a5d0 54 45 53 54 0a 20 20 20 20 63 61 73 65 20 53 51  TEST.    case SQ
1a5e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
1a5f0 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20  _SET_HANDLE: {. 
1a600 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68       LPHANDLE ph
1a610 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45  File = (LPHANDLE
1a620 29 70 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e  )pArg;.      HAN
1a630 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70  DLE hOldFile = p
1a640 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70  File->h;.      p
1a650 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c  File->h = *phFil
1a660 65 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65  e;.      *phFile
1a670 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20   = hOldFile;.   
1a680 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1a690 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e  TL oldFile=%p, n
1a6a0 65 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  ewFile=%p, rc=SQ
1a6b0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
1a6c0 20 20 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46             hOldF
1a6d0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
1a6e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a6f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1a700 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53  endif.    case S
1a710 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
1a720 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
1a730 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
1a740 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   0;.      int rc
1a750 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d   = winGetTempnam
1a760 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26  e(pFile->pVfs, &
1a770 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  zTFile);.      i
1a780 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a790 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68   ){.        *(ch
1a7a0 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
1a7b0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
1a7c0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1a7d0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
1a7e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
1a7f0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1a800 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
1a810 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20  n rc;.    }.#if 
1a820 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1a830 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
1a840 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
1a850 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
1a860 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
1a870 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
1a880 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a890 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
1a8a0 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
1a8b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
1a8c0 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
1a8d0 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
1a8e0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1a8f0 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mmap;.      }.  
1a900 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
1a910 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1a920 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
1a930 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
1a940 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
1a950 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
1a960 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
1a970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1a980 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1a990 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
1a9a0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
1a9b0 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1a9c0 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70          winUnmap
1a9d0 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
1a9e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d         rc = winM
1a9f0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
1aa00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1aa10 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1aa20 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1aa30 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
1aa40 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
1aa50 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1aa60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1aa70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1aa80 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1aa90 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1aaa0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22  LITE_NOTFOUND\n"
1aab0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1aac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1aad0 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1aae0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1aaf0 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1ab00 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1ab10 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1ab20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1ab30 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1ab40 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1ab50 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1ab60 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1ab70 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1ab80 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1ab90 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1aba0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1abb0 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1abc0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1abd0 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1abe0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1abf0 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1ac00 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1ac10 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1ac20 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1ac30 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1ac40 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1ac50 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1ac60 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
1ac70 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
1ac80 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1ac90 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69   *id){.  (void)i
1aca0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1acb0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1acc0 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
1acd0 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72   Return a vector
1ace0 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61   of device chara
1acf0 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73  cteristics..*/.s
1ad00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76  tatic int winDev
1ad10 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1ad20 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1ad30 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  *id){.  winFile 
1ad40 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  *p = (winFile*)i
1ad50 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1ad60 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
1ad70 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c  ABLE_WHEN_OPEN |
1ad80 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63  .         ((p->c
1ad90 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
1ada0 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f  LE_PSOW)?SQLITE_
1adb0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1adc0 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a  OVERWRITE:0);.}.
1add0 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  ./*.** Windows w
1ade0 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
1adf0 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
1ae00 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
1ae10 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
1ae20 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
1ae30 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
1ae40 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
1ae50 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
1ae60 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
1ae70 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
1ae80 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
1ae90 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e  static SYSTEM_IN
1aea0 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
1aeb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1aec0 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
1aed0 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
1aee0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
1aef0 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
1af00 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
1af10 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
1af20 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
1af30 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
1af40 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
1af50 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20  y.** this file, 
1af60 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
1af70 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
1af80 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
1af90 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
1afa0 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1afb0 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
1afc0 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
1afd0 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73  obal mutex.** is
1afe0 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
1aff0 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
1b000 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
1b010 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1b020 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
1b030 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
1b040 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1b050 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
1b060 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
1b070 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
1b080 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
1b090 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1b0a0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
1b0b0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
1b0c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
1b0d0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1b0e0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1b0f0 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61 74  C_VFS1));.}.stat
1b100 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65  ic void winShmLe
1b110 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
1b120 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b130 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
1b140 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1b150 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
1b160 29 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ));.}.#ifndef ND
1b170 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
1b180 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1b190 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
1b1a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b1b0 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
1b1c0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1b1d0 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29  EX_STATIC_VFS1))
1b1e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1b1f0 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1b200 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e   represent a sin
1b210 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  gle file opened 
1b220 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70  and mmapped to p
1b230 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64  rovide.** shared
1b240 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d   memory.  When m
1b250 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
1b260 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
1b270 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75  e same.** log-su
1b280 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65  mmary, each thre
1b290 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77  ad has its own w
1b2a0 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62  inFile object, b
1b2b0 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70  ut they all.** p
1b2c0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
1b2d0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1b2e0 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  s object.  In ot
1b2f0 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a  her words, each.
1b300 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69  ** log-summary i
1b310 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e  s opened only on
1b320 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
1b330 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65  **.** winShmMute
1b340 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
1b350 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
1b360 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
1b370 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
1b380 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
1b390 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
1b3a0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1b3b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
1b3c0 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 0a  f.**      pNext.
1b3d0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1b3e0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
1b3f0 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
1b400 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
1b410 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ated:.**.**     
1b420 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1b430 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1b440 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
1b450 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
1b460 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
1b470 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
1b480 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1b490 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1b4a0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b4b0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1b4c0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1b4d0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
1b4e0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
1b4f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b500 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
1b510 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
1b520 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1b530 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1b540 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1b550 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b560 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
1b570 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
1b580 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
1b590 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
1b5a0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b5c0 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
1b5d0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
1b5e0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b600 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
1b610 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
1b620 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
1b630 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
1b640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b650 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
1b660 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
1b670 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
1b680 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
1b690 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
1b6a0 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
1b6b0 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
1b6c0 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
1b6d0 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1b6e0 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
1b710 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1b720 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1b730 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
1b740 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b750 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
1b760 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1b770 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
1b780 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
1b790 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
1b7a0 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
1b7b0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
1b7c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1b7d0 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1b7e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
1b7f0 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38  E_OS_TRACE).  u8
1b800 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
1b810 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1b820 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68   available winSh
1b830 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1b840 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
1b850 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66   global array of
1b860 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
1b870 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  objects..**.** T
1b880 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  he winShmMutexHe
1b890 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1b8a0 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  e while reading 
1b8b0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  or writing this 
1b8c0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1b8d0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53  winShmNode *winS
1b8e0 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  hmNodeList = 0;.
1b8f0 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
1b900 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
1b910 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
1b920 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
1b930 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
1b940 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
1b950 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
1b960 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1b970 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
1b980 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
1b990 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
1b9a0 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
1b9b0 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
1b9c0 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  .**.**    winShm
1b9d0 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20  .pShmNode.**    
1b9e0 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  winShm.id.**.** 
1b9f0 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
1ba00 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
1ba10 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68    The winShm.pSh
1ba20 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73  mNode->mutex mus
1ba30 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
1ba40 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
1ba50 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
1ba60 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ds..*/.struct wi
1ba70 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e  nShm {.  winShmN
1ba80 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1ba90 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
1baa0 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  lying winShmNode
1bab0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e   object */.  win
1bac0 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
1bad0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1bae0 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20  winShm with the 
1baf0 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20  same winShmNode 
1bb00 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
1bb10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bb20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
1bb30 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  ng the winShmNod
1bb40 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36  e mutex */.  u16
1bb50 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
1bb60 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1bb70 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
1bb80 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
1bb90 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
1bba0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1bbb0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1bbc0 68 65 6c 64 20 2a 2f 0a 23 69 66 20 64 65 66 69  held */.#if defi
1bbd0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1bbe0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1bbf0 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
1bc00 45 29 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  E).  u8 id;     
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
1bc30 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
1bc40 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
1bc50 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
1bc60 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
1bc70 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
1bc80 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
1bc90 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
1bca0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
1bcb0 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
1bcc0 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
1bcd0 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
1bce0 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
1bcf0 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
1bd00 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
1bd10 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
1bd20 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
1bd30 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
1bd40 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
1bd50 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
1bd60 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
1bd70 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
1bd80 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
1bd90 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
1bda0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
1bdb0 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
1bdc0 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
1bdd0 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
1bde0 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
1bdf0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1be00 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
1be10 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
1be20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
1be30 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
1be40 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
1be50 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1be60 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
1be70 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
1be80 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
1be90 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1beb0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1bec0 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
1bed0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
1bee0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1bef0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1bf00 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
1bf10 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
1bf20 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
1bf30 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1bf40 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
1bf50 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
1bf60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bf70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
1bf80 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
1bf90 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
1bfa0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1bfb0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
1bfc0 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ock=%d, offset=%
1bfd0 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20  d, size=%d\n",. 
1bfe0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1bff0 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79  >hFile.h, lockTy
1c000 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29  pe, ofst, nByte)
1c010 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
1c020 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73  /Acquire the sys
1c030 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
1c040 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  /.  if( lockType
1c050 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  ==_SHM_UNLCK ){.
1c060 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f      rc = winUnlo
1c070 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
1c080 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c  File.h, ofst, 0,
1c090 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65   nByte, 0);.  }e
1c0a0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
1c0b0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
1c0c0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1c0d0 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61  .    DWORD dwFla
1c0e0 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
1c0f0 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
1c100 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1c110 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
1c120 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
1c130 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
1c140 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  OCK;.    rc = wi
1c150 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
1c160 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61  ->hFile.h, dwFla
1c170 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  gs, ofst, 0, nBy
1c180 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69  te, 0);.  }..  i
1c190 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
1c1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c1b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1c1c0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1c1d0 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
1c1e0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
1c1f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1c200 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1c210 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e  OCK file=%p, fun
1c220 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c  c=%s, errno=%lu,
1c230 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1c240 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1c250 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20  le.h, (lockType 
1c260 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f  == _SHM_UNLCK) ?
1c270 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22   "winUnlockFile"
1c280 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77   :.           "w
1c290 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69  inLockFile", pFi
1c2a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73  le->lastErrno, s
1c2b0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1c2c0 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1c2d0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1c2e0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
1c2f0 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
1c300 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
1c310 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
1c320 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
1c330 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
1c340 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
1c350 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
1c360 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
1c370 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
1c380 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
1c390 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1c3a0 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1c3b0 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
1c3c0 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
1c3d0 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
1c3e0 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1c3f0 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
1c400 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
1c410 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
1c420 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1c430 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
1c440 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
1c450 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1c460 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
1c470 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
1c480 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
1c490 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  de *p;.  assert(
1c4a0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1c4b0 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  () );.  OSTRACE(
1c4c0 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d  ("SHM-PURGE pid=
1c4d0 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d  %lu, deleteFlag=
1c4e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1c4f0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1c500 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74  ocessId(), delet
1c510 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20  eFlag));.  pp = 
1c520 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
1c530 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
1c540 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
1c550 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
1c560 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1c570 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
1c580 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ){ sqlite3_mutex
1c590 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1c5a0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
1c5b0 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
1c5c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f  i++){.        BO
1c5d0 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70  OL bRc = osUnmap
1c5e0 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
1c5f0 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
1c600 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1c610 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41  ("SHM-PURGE-UNMA
1c620 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1c630 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c650 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c660 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1c670 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1c680 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1c690 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1c6a0 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1c6b0 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
1c6c0 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
1c6d0 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
1c6e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1c6f0 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64  -PURGE-CLOSE pid
1c700 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1c710 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1c720 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1c730 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1c740 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
1c750 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1c760 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
1c770 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
1c780 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Rc);.      }.   
1c790 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
1c7a0 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46  h!=NULL && p->hF
1c7b0 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  ile.h!=INVALID_H
1c7c0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
1c7d0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1c7e0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1c7f0 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
1c800 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1c810 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
1c820 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1c830 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1c840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c850 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
1c860 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1c870 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1c880 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c890 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1c8a0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69  oc();.        wi
1c8b0 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
1c8c0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
1c8d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c8e0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
1c8f0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1c900 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1c910 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1c920 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1c930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1c940 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29  free(p->aRegion)
1c950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1c960 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
1c970 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
1c980 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
1c990 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
1c9a0 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  n the shared-mem
1c9b0 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
1c9c0 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
1c9d0 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a  e file pDbFd..**
1c9e0 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
1c9f0 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
1ca00 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
1ca10 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
1ca20 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
1ca30 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
1ca40 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
1ca50 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
1ca60 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
1ca70 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
1ca80 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
1ca90 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
1caa0 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
1cab0 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
1cac0 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53  tic int winOpenS
1cad0 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46  haredMemory(winF
1cae0 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
1caf0 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b  truct winShm *p;
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb10 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
1cb20 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
1cb30 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
1cb40 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1cb50 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  e = 0;   /* The 
1cb60 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1cb70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1cb80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1cbb0 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
1cbc0 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
1cbd0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
1cbe0 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d  allocated winShm
1cbf0 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  Node */.  int nN
1cc00 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
1cc30 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73   bytes */..  ass
1cc40 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
1cc50 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74  ==0 );    /* Not
1cc60 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1cc70 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ed */..  /* Allo
1cc80 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1cc90 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
1cca0 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f  hm object.  Also
1ccb0 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20   speculatively. 
1ccc0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   ** allocate spa
1ccd0 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e  ce for a new win
1cce0 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65  ShmNode and file
1ccf0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  name..  */.  p =
1cd00 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1cd10 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  ro( sizeof(*p) )
1cd20 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1cd30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1cd40 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
1cd50 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1cd60 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
1cd70 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
1cd80 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1cd90 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
1cda0 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
1cdb0 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
1cdc0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1cdd0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1cde0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1cdf0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1ce00 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c    }.  pNew->zFil
1ce10 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
1ce20 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74  pNew[1];.  sqlit
1ce30 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d  e3_snprintf(nNam
1ce40 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  e+15, pNew->zFil
1ce50 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
1ce60 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1ce70 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
1ce80 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
1ce90 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  h, pNew->zFilena
1cea0 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  me);..  /* Look 
1ceb0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
1cec0 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
1ced0 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
1cee0 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
1cef0 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
1cf00 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
1cf10 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
1cf20 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
1cf30 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1cf40 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
1cf50 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
1cf60 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
1cf70 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
1cf80 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
1cf90 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
1cfa0 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
1cfb0 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
1cfc0 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
1cfd0 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
1cfe0 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
1cff0 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
1d000 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1d010 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
1d020 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
1d030 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
1d040 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1d050 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
1d060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d070 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
1d080 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
1d090 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
1d0a0 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
1d0b0 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
1d0c0 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
1d0d0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
1d0e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
1d0f0 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
1d100 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
1d110 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
1d120 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
1d130 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
1d140 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1d150 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
1d160 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
1d170 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
1d180 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d190 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1d1a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
1d1b0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1d1c0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
1d1d0 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
1d1e0 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
1d1f0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
1d200 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
1d210 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1d220 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
1d230 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
1d240 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
1d250 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
1d260 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
1d270 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d290 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
1d2a0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
1d2b0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1d2c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20  _OPEN_CREATE,.  
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1d2e0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
1d2f0 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
1d300 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1d310 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1d320 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1d330 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
1d340 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
1d350 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
1d360 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74  h..    ** If not
1d370 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  , truncate the f
1d380 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1d390 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  th..    */.    i
1d3a0 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
1d3b0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1d3c0 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
1d3d0 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
1d3e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1d3f0 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1d400 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1d410 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1d420 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1d430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d440 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1d450 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d460 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f  IOERR_SHMOPEN, o
1d470 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1d480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d490 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
1d4a0 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
1d4b0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1d4c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1d4d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4e0 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
1d4f0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1d500 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1d510 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1d520 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1d530 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1d540 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
1d550 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1d560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
1d570 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1d580 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
1d590 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
1d5a0 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
1d5b0 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
1d5c0 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1d5d0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
1d5e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d5f0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1d600 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
1d610 53 5f 54 52 41 43 45 29 0a 20 20 70 2d 3e 69 64  S_TRACE).  p->id
1d620 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1d630 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1d640 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1d650 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1d660 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1d670 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1d680 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1d690 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1d6a0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1d6b0 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1d6c0 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1d6d0 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1d6e0 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1d6f0 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1d700 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1d710 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1d720 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1d730 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1d740 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1d750 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1d760 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1d770 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1d780 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1d790 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1d7a0 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1d7b0 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1d7c0 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1d7d0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1d7e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20  ShmNode->mutex. 
1d7f0 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1d800 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d810 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1d820 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1d830 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1d840 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1d850 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1d860 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d870 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1d880 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1d890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1d8a0 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
1d8b0 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
1d8c0 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68  pen_err:.  winSh
1d8d0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1d8e0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1d8f0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1d900 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65  );.  winShmPurge
1d910 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29  (pDbFd->pVfs, 0)
1d920 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;      /* This c
1d930 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
1d940 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
1d950 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1d960 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
1d970 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e  ree(pNew);.  win
1d980 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1d990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d9a0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1d9b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
1d9c0 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c  red-memory.  Del
1d9d0 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ete the underlyi
1d9e0 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  ng.** storage if
1d9f0 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
1da00 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
1da10 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
1da20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1da30 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
1da40 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1da50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1da60 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
1da70 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
1da80 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
1da90 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
1daa0 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1dab0 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
1dac0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1dad0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1dae0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
1daf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1db00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1db10 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
1db20 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1db30 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
1db40 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
1db50 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
1db60 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
1db70 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1db80 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
1db90 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
1dba0 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
1dbb0 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
1dbc0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
1dbd0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1dbe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
1dbf0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
1dc00 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
1dc10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
1dc20 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
1dc30 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
1dc40 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
1dc50 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
1dc60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1dc70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1dc80 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
1dc90 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
1dca0 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
1dcb0 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
1dcc0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
1dcd0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
1dce0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
1dcf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1dd00 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
1dd10 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1dd20 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1dd30 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
1dd40 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
1dd50 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
1dd60 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
1dd70 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
1dd80 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
1dd90 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
1dda0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1ddb0 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
1ddc0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
1ddd0 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
1dde0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
1ddf0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
1de00 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
1de10 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
1de20 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
1de30 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1de40 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
1de50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1de60 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
1de70 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
1de80 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1de90 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
1dea0 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
1deb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1dec0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1ded0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
1dee0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1def0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1df00 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1df10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1df20 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
1df30 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1df40 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df60 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
1df70 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
1df80 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
1df90 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1dfa0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1dfb0 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
1dfc0 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
1dfd0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1dfe0 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
1dff0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
1e000 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1e010 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1e020 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1e030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1e040 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
1e050 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
1e060 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
1e070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1e090 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1e0a0 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
1e0b0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1e0c0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1e0d0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1e0e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e100 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
1e110 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1e140 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
1e150 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
1e160 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
1e170 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
1e180 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
1e190 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
1e1a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
1e1b0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1e1c0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1e1d0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1e1e0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1e1f0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1e200 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1e210 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
1e220 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1e230 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1e240 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1e250 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1e260 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1e270 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1e280 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
1e290 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
1e2a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1e2b0 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
1e2c0 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
1e2d0 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
1e2e0 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
1e2f0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
1e300 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
1e310 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
1e320 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1e330 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
1e340 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1e350 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
1e360 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
1e370 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
1e380 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
1e390 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
1e3a0 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
1e3b0 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
1e3c0 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
1e3d0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1e3e0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1e3f0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1e400 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
1e410 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
1e420 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
1e430 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
1e440 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
1e450 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
1e460 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
1e470 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1e480 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
1e490 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1e4a0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
1e4b0 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
1e4c0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
1e4d0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1e4e0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1e4f0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_UNLCK, ofst+
1e500 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1e510 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1e530 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
1e540 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
1e550 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1e560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e570 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
1e580 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1e590 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
1e5a0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
1e5b0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
1e5c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1e5d0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
1e5e0 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
1e5f0 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
1e600 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
1e610 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
1e620 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
1e630 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
1e640 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
1e650 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
1e660 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
1e670 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
1e680 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
1e690 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
1e6a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
1e6b0 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
1e6c0 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
1e6d0 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
1e6e0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1e6f0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1e700 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1e710 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1e720 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1e730 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e740 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1e750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e760 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
1e770 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
1e780 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1e790 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
1e7a0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1e7b0 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
1e7c0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
1e7d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e7e0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
1e7f0 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
1e800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e810 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1e820 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1e830 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
1e840 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1e850 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e860 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e870 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1e880 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
1e890 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
1e8a0 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
1e8b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e8c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
1e8d0 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
1e8e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1e8f0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
1e900 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
1e910 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
1e920 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
1e930 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
1e940 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
1e950 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1e960 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
1e970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1e980 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1e990 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1e9a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1e9b0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1e9c0 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
1e9d0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
1e9e0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
1e9f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ea00 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
1ea10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ea20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1ea30 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
1ea40 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1ea50 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
1ea60 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
1ea70 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
1ea80 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
1ea90 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
1eaa0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1eab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eac0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1ead0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1eae0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52  ShmNode, _SHM_WR
1eaf0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1eb00 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1eb10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1eb20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
1eb30 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
1eb40 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
1eb50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
1eb60 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
1eb70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1eb80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1eb90 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1eba0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
1ebb0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1ebc0 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20  pid=%lu, id=%d, 
1ebd0 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c  sharedMask=%03x,
1ebe0 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20   exclMask=%03x, 
1ebf0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1ec00 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ec10 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
1ec20 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  >id, p->sharedMa
1ec30 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
1ec40 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
1ec50 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1ec60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ec70 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1ec80 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  t a memory barri
1ec90 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e  er or memory fen
1eca0 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d  ce on shared mem
1ecb0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  ory..**.** All l
1ecc0 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
1ecd0 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
1ece0 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
1ecf0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
1ed00 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
1ed10 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
1ed20 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
1ed30 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1ed40 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
1ed50 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
1ed60 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1ed70 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1ed80 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
1ed90 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1eda0 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69  ETER(fd);.  sqli
1edb0 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  te3MemoryBarrier
1edc0 28 29 3b 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65  ();   /* compile
1edd0 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
1ede0 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69   barrier */.  wi
1edf0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1ee00 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20  ;       /* Also 
1ee10 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e  mutex, for redun
1ee20 64 61 6e 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68  dancy */.  winSh
1ee30 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
1ee40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ee50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ee60 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
1ee70 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
1ee80 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  egion of the.** 
1ee90 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
1eea0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1eeb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1eec0 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
1eed0 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65  y regions.** are
1eee0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
1eef0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
1ef00 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
1ef10 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
1ef20 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ion.** bytes in 
1ef30 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
1ef40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1ef50 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1ef60 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ef70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
1ef80 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ef90 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74  e, if the isWrit
1efa0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  e parameter is 0
1efb0 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1efc0 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1efd0 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
1efe0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1eff0 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
1f000 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
1f010 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
1f020 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1f030 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
1f040 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
1f050 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1f060 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 65  d. If.** isWrite
1f070 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
1f080 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1f090 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1f0a0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a  ion has not yet.
1f0b0 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
1f0c0 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
1f0d0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1f0e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
1f0f0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1f100 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
1f110 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
1f120 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
1f130 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
1f140 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
1f150 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
1f160 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
1f170 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61  s processes.** a
1f180 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66  ddress space (if
1f190 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1f1a0 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20  dy), *pp is set 
1f1b0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1f1c0 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79  mapped.** memory
1f1d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1f1e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1f1f0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
1f200 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1f210 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
1f220 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
1f230 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
1f240 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
1f250 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1f260 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1f270 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
1f280 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
1f290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f2a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1f2b0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
1f2c0 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f2e0 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
1f2f0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
1f300 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
1f310 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
1f320 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
1f330 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
1f340 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
1f350 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1f360 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d  ;.  winShm *pShm
1f370 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1f380 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1f390 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1f3a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f3b0 20 69 66 28 20 21 70 53 68 6d 20 29 7b 0a 20 20   if( !pShm ){.  
1f3c0 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
1f3d0 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
1f3e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f3f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f400 6e 20 72 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d  n rc;.    pShm =
1f410 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1f420 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
1f430 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  Shm->pShmNode;..
1f440 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f450 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1f460 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
1f470 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
1f480 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
1f490 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
1f4a0 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
1f4b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1f4c0 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
1f4d0 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
1f4e0 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
1f4f0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
1f500 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
1f510 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1f520 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
1f530 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
1f540 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
1f550 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
1f560 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f580 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
1f590 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
1f5a0 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
1f5b0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
1f5c0 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
1f5d0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
1f5e0 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
1f5f0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
1f600 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
1f610 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
1f620 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
1f630 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1f640 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
1f650 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
1f660 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
1f670 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
1f680 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
1f690 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
1f6a0 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
1f6b0 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
1f6c0 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
1f6d0 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
1f6e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f6f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1f700 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1f710 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1f720 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1f730 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1f740 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1f750 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e  hmMap1", pDbFd->
1f760 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f  zPath);.      go
1f770 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1f780 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
1f790 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  z<nByte ){.     
1f7a0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1f7b0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1f7c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
1f7d0 49 66 20 69 73 57 72 69 74 65 20 69 73 20 73 65  If isWrite is se
1f7e0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65  t to.      ** ze
1f7f0 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20  ro, exit early. 
1f800 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20  *pp will be set 
1f810 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
1f820 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1f830 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1f840 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
1f850 20 69 66 20 69 73 57 72 69 74 65 20 69 73 20 6e   if isWrite is n
1f860 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72  on-zero, use ftr
1f870 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f  uncate() to allo
1f880 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  cate.      ** th
1f890 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1f8a0 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20  ry region..     
1f8b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
1f8c0 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68  sWrite ) goto sh
1f8d0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1f8e0 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
1f8f0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1f900 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1f910 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  le, nByte);.    
1f920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f940 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1f950 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1f960 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
1f970 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70   "winShmMap2", p
1f9a0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1f9b0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1f9c0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1f9d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
1f9e0 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
1f9f0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
1fa00 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1fa10 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1fa20 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
1fa30 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f  (struct ShmRegio
1fa40 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  n *)sqlite3_real
1fa50 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20 70  loc64(.        p
1fa60 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1fa70 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
1fa80 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20  zeof(apNew[0]). 
1fa90 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
1faa0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
1fab0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1fac0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
1fad0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1fae0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
1faf0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
1fb00 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
1fb10 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
1fb20 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1fb30 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
1fb40 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  hMap = NULL;    
1fb50 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
1fb60 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
1fb70 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
1fb80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1fb90 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
1fba0 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66  y region */..#if
1fbb0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1fbc0 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1fbd0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1fbe0 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64  gFromApp(pShmNod
1fbf0 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
1fc00 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
1fc10 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74  _READWRITE, nByt
1fc20 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1fc30 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1fc40 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1fc50 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70  WIDE).      hMap
1fc60 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1fc70 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65  appingW(pShmNode
1fc80 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
1fc90 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
1fca0 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
1fcb0 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1fcc0 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1fcd0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1fce0 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54  S_ANSI) && SQLIT
1fcf0 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
1fd00 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 20  LEMAPPINGA.     
1fd10 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1fd20 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
1fd30 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1fd40 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1fd50 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1fd60 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1fd70 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
1fd80 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1fd90 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69  HM-MAP-CREATE pi
1fda0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1fdb0 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73  , size=%d, rc=%s
1fdc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1fdd0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1fde0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
1fdf0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
1fe00 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
1fe10 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b        hMap ? "ok
1fe20 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1fe30 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1fe40 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
1fe50 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65  ffset = pShmNode
1fe60 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
1fe70 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  on;.        int 
1fe80 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1fe90 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1fea0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1feb0 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66  Granularity;.#if
1fec0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1fed0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1fee0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1fef0 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c  romApp(hMap, FIL
1ff00 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
1ff10 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
1ff20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
1ff30 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
1ff40 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
1ff50 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
1ff60 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
1ff70 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1ff80 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
1ff90 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1ffa0 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1ffb0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f             0, iO
1ffc0 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
1ffd0 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
1ffe0 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
1fff0 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
20000 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
20010 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69  ("SHM-MAP-MAP pi
20020 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
20030 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
20040 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
20070 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
20080 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66  de->nRegion, iOf
20090 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  fset,.          
200a0 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c         szRegion,
200b0 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   pMap ? "ok" : "
200c0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
200d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d   }.      if( !pM
200e0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  ap ){.        pS
200f0 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
20100 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
20110 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63  or();.        rc
20120 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
20130 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
20140 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61  AP, pShmNode->la
20150 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20170 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20    "winShmMap3", 
20180 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
20190 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20         if( hMap 
201a0 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  ) osCloseHandle(
201b0 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67  hMap);.        g
201c0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
201d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
201e0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
201f0 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
20200 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70  ion].pMap = pMap
20210 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
20220 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
20230 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61  de->nRegion].hMa
20240 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20  p = hMap;.      
20250 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20260 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
20270 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
20280 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
20290 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
202a0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
202b0 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  = iRegion*szRegi
202c0 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  on;.    int iOff
202d0 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
202e0 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
202f0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
20300 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61  ularity;.    cha
20310 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70  r *p = (char *)p
20320 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
20330 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a  [iRegion].pMap;.
20340 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20      *pp = (void 
20350 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66  *)&p[iOffsetShif
20360 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
20370 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
20380 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20390 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
203a0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
203b0 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
203c0 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20  fine winShmMap  
203d0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
203e0 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  nShmLock    0.# 
203f0 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72  define winShmBar
20400 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
20410 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  winShmUnmap   0.
20420 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
20430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
20440 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  L */../*.** Clea
20450 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64  ns up the mapped
20460 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73   region of the s
20470 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69  pecified file, i
20480 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51  f any..*/.#if SQ
20490 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
204a0 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
204b0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
204c0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
204d0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
204e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
204f0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
20500 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d  lu, pFile=%p, hM
20510 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  ap=%p, pMapRegio
20520 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
20530 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c     "mmapSize=%ll
20540 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d, mmapSizeActua
20550 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65  l=%lld, mmapSize
20560 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  Max=%lld\n",.   
20570 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20580 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20590 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
205a0 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  Map, pFile->pMap
205b0 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Region,.        
205c0 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
205d0 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ze, pFile->mmapS
205e0 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c 65  izeActual, pFile
205f0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b  ->mmapSizeMax));
20600 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
20610 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
20620 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77  if( !osUnmapView
20630 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d  OfFile(pFile->pM
20640 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20  apRegion) ){.   
20650 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
20660 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
20670 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
20680 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
20690 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
206a0 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  e=%p, pMapRegion
206b0 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
206c0 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45        "rc=SQLITE
206d0 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20  _IOERR_MMAP\n", 
206e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
206f0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a  essId(), pFile,.
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20710 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
20720 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
20730 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
20740 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
20750 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
20760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20770 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
20780 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c  nmapfile1", pFil
20790 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
207a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  .    pFile->pMap
207b0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Region = 0;.    
207c0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
207d0 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
207e0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
207f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46   0;.  }.  if( pF
20800 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20  ile->hMap!=NULL 
20810 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c  ){.    if( !osCl
20820 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
20830 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20  >hMap) ){.      
20840 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
20850 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
20860 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
20870 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
20880 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20890 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53  p, hMap=%p, rc=S
208a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
208b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
208c0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
208d0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
208e0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29  le, pFile->hMap)
208f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20900 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
20910 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
20920 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
20930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20940 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
20950 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65  mapfile2", pFile
20960 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
20970 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
20980 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53  = NULL;.  }.  OS
20990 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
209a0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
209b0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
209c0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
209d0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
209e0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
209f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
20a00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20a10 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
20a20 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
20a30 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
20a40 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
20a50 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
20a60 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
20a70 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
20a80 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
20a90 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
20aa0 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72   if.** there alr
20ab0 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
20ac0 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
20ad0 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
20ae0 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73  re still.** outs
20af0 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
20b00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
20b10 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
20b20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
20b30 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
20b40 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
20b50 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
20b60 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
20b70 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d  size of.** the m
20b80 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
20b90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
20ba0 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
20bb0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
20bc0 65 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73  e.** requested s
20bd0 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
20be0 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
20bf0 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
20c00 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
20c10 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
20c20 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
20c30 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
20c40 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
20c50 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c  red.** using SQL
20c60 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
20c70 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69  IZE, whichever i
20c80 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
20c90 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20ca0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
20cb0 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
20cc0 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
20cd0 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
20ce0 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
20cf0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
20d00 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
20d10 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
20d20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
20d30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
20d40 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
20d50 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69   *pFd, sqlite3_i
20d60 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73  nt64 nByte){.  s
20d70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61  qlite3_int64 nMa
20d80 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  p = nByte;.  int
20d90 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
20da0 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
20db0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
20dc0 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
20dd0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
20de0 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c  ile=%p, size=%ll
20df0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
20e00 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
20e10 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e  cessId(), pFd, n
20e20 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70  Byte));..  if( p
20e30 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
20e40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20e50 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
20e60 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 ){.    rc = wi
20e70 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
20e80 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e  e3_file*)pFd, &n
20e90 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Map);.    if( rc
20ea0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
20eb0 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
20ec0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20ed0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
20ee0 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20  FSTAT\n",.      
20ef0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20f00 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20f10 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72  , pFd));.      r
20f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
20f30 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
20f40 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
20f50 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
20f60 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
20f70 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
20f80 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28    }.  nMap &= ~(
20f90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77  sqlite3_int64)(w
20fa0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
20fb0 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66  Size - 1);..  if
20fc0 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64  ( nMap==0 && pFd
20fd0 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
20fe0 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
20ff0 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pFd);.  }.  if(
21000 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
21010 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64  Size ){.    void
21020 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
21030 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
21040 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
21050 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d     DWORD flags =
21060 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
21070 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
21080 65 28 70 46 64 29 3b 0a 23 69 66 64 65 66 20 53  e(pFd);.#ifdef S
21090 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57  QLITE_MMAP_READW
210a0 52 49 54 45 0a 20 20 20 20 69 66 28 20 28 70 46  RITE.    if( (pF
210b0 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
210c0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
210d0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
210e0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
210f0 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
21100 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
21110 54 45 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  TE;.    }.#endif
21120 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
21130 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INRT.    pFd->hM
21140 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
21150 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
21160 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
21170 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c  otect, nMap, NUL
21180 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
21190 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
211a0 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64  AS_WIDE).    pFd
211b0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
211c0 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46  eFileMappingW(pF
211d0 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
211e0 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
21210 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
21220 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
21250 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
21260 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ), NULL);.#elif 
21270 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
21280 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
21290 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  & SQLITE_WIN32_C
212a0 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47  REATEFILEMAPPING
212b0 41 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  A.    pFd->hMap 
212c0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
212d0 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e  ppingA(pFd->h, N
212e0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
21310 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
21320 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
21360 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
21370 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
21380 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c  ( pFd->hMap==NUL
21390 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  L ){.      pFd->
213a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
213b0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
213c0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
213d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
213e0 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73  R_MMAP, pFd->las
213f0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21410 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70 46  winMapfile1", pF
21420 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
21430 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f   /* Log the erro
21440 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  r, but continue 
21450 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e  normal operation
21460 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
21470 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54  ite */.      OST
21480 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d  RACE(("MAP-FILE-
21490 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
214a0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c  pFile=%p, rc=%s\
214b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
214c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
214d0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
214e0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
214f0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
21500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21510 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21520 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73 49   (nMap % winSysI
21530 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29 3d  nfo.dwPageSize)=
21540 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
21550 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29  ( sizeof(SIZE_T)
21560 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ==sizeof(sqlite3
21570 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c  _int64) || nMap<
21580 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a 23  =0xffffffff );.#
21590 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
215a0 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  RT.    pNew = os
215b0 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
215c0 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20  mApp(pFd->hMap, 
215d0 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f  flags, 0, (SIZE_
215e0 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20  T)nMap);.#else. 
215f0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56     pNew = osMapV
21600 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68  iewOfFile(pFd->h
21610 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  Map, flags, 0, 0
21620 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
21630 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
21640 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
21650 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
21660 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20  e(pFd->hMap);.  
21670 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
21680 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d  NULL;.      pFd-
21690 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
216a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
216b0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
216c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
216d0 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
216e0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70  "winMapfile2", p
21710 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
21720 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
21730 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
21740 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
21750 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
21760 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
21770 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
21780 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  -MAP pid=%lu, pF
21790 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
217a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
217b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
217c0 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73  cessId(), pFd, s
217d0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
217e0 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
217f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
21800 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70   }.    pFd->pMap
21810 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20  Region = pNew;. 
21820 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
21830 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64   = nMap;.    pFd
21840 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
21850 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20   = nMap;.  }..  
21860 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
21870 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
21880 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
21890 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
218a0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
218b0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29  ocessId(), pFd))
218c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
218d0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
218e0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
218f0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
21900 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
21910 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
21920 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
21930 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
21940 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
21950 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
21960 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
21970 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
21980 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
21990 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
219a0 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
219b0 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
219c0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
219d0 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
219e0 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
219f0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
21a00 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
21a10 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
21a20 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
21a30 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
21a40 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
21a50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
21a60 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
21a70 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
21a80 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
21a90 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
21aa0 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
21ab0 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
21ac0 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
21ad0 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
21ae0 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  ly.** release th
21af0 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
21b00 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63  alling winUnfetc
21b10 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
21b20 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69  nt winFetch(sqli
21b30 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
21b40 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
21b50 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
21b60 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21b70 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
21b80 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
21b90 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
21ba0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
21bb0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
21bc0 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
21bd0 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
21be0 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
21bf0 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
21c00 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d  , amount=%d, pp=
21c10 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
21c20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
21c30 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69  ocessId(), fd, i
21c40 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b  Off, nAmt, pp));
21c50 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
21c60 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
21c70 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
21c80 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
21c90 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
21ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
21cb0 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
21cc0 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
21cd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21ce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53  OK ){.        OS
21cf0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
21d00 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
21d10 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
21d20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
21d30 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
21d40 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
21d50 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
21d60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
21d70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
21d80 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
21d90 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
21da0 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
21db0 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
21dc0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
21dd0 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
21de0 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
21df0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
21e00 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
21e10 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
21e20 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c  , pp=%p, *pp=%p,
21e30 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
21e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
21e50 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
21e60 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70  Id(), fd, pp, *p
21e70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p));.  return SQ
21e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21e90 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
21ea0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
21eb0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
21ec0 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
21ed0 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20   a.** reference 
21ee0 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
21ef0 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77  arlier call to w
21f00 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  inFetch(). The s
21f10 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
21f20 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
21f30 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
21f40 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
21f50 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
21f60 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
21f70 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
21f80 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e  he winFetch() in
21f90 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  vocation..**.** 
21fa0 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
21fb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
21fc0 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
21fd0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
21fe0 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f  alled.** to info
21ff0 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
22000 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
22010 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
22020 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a  xisting mapping.
22030 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
22040 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
22050 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
22060 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
22070 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nfetch(sqlite3_f
22080 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
22090 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66  f, void *p){.#if
220a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
220b0 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
220c0 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
220d0 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
220e0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
220f0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  ase file */..  /
22100 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
22110 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
22120 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
22130 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
22140 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ing.  ** xFetch 
22150 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
22160 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
22170 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
22180 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
22190 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
221a0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
221b0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
221c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
221d0 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
221e0 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
221f0 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
22200 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
22210 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
22220 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
22230 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
22240 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
22250 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
22260 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  UNFETCH pid=%lu,
22270 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
22280 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c  t=%lld, p=%p\n",
22290 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
222a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
222b0 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20  d(), pFd, iOff, 
222c0 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  p));..  if( p ){
222d0 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
222e0 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
222f0 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49      /* FIXME:  I
22300 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20  f Windows truly 
22310 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73 20  always prevents 
22320 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65  truncating or de
22330 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20  leting a.    ** 
22340 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70  file while a map
22350 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68  ping is held, th
22360 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
22370 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20   winUnmapfile() 
22380 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75  call.    ** is u
22390 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20 62  nnecessary can b
223a0 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
223b0 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
223c0 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
223d0 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
223e0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
223f0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
22400 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
22410 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
22420 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
22430 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
22440 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
22450 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22460 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22470 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
22480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22490 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
224a0 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
224b0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
224c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
224d0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
224e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
224f0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
22500 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
22510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22520 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
22530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22570 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
22580 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
22590 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
225a0 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
225b0 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
225c0 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
225d0 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
225e0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
225f0 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
22600 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
22630 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
22640 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
22650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22660 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
22670 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
22680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
22690 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
226a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
226b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
226c0 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
226d0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
226e0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
226f0 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
22700 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
22710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
22720 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
22730 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
22740 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
22750 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
22760 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
22770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
22780 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
22790 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
227a0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
227b0 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
227c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
227d0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
227e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
227f0 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
22800 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
22810 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
22820 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
22830 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
22840 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
22850 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
22860 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22870 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
22880 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
22890 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
228a0 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
228b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
228c0 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
228d0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
228e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
228f0 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
22900 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
22910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22920 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
22930 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
22960 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
22990 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
229c0 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
229d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
229e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
229f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a10 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
22a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
22a30 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
22a40 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
22a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
22a60 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
22a70 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
22a80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
22a90 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
22aa0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
22ab0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66   object..*/..#if
22ac0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
22ad0 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  N__)./*.** Conve
22ae0 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72  rt a filename fr
22af0 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20  om whatever the 
22b00 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
22b10 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73  ting system.** s
22b20 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65  upports for file
22b30 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38  names into UTF-8
22b40 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
22b50 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a   the result is.*
22b60 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
22b70 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
22b80 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
22b90 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
22ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
22bb0 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74   *winConvertToUt
22bc0 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
22bd0 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
22be0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76  ){.  char *zConv
22bf0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
22c00 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
22c10 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
22c20 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
22c30 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
22c40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
22c50 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
22c60 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
22c70 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
22c80 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
22c90 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
22ca0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
22cb0 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
22cc0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
22cd0 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
22ce0 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ted;.}.#endif../
22cf0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
22d00 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e  TF-8 filename in
22d10 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
22d20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
22d30 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
22d40 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61  tem wants filena
22d50 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74  mes in.  Space t
22d60 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
22d70 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  t.** is obtained
22d80 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
22d90 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
22da0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
22db0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
22dc0 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f  atic void *winCo
22dd0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
22de0 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
22df0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
22e00 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
22e10 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73   = 0;.  if( osIs
22e20 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
22e30 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38  verted = winUtf8
22e40 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
22e50 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
22e60 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
22e70 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
22e80 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
22e90 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
22ea0 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
22eb0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
22ec0 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
22ed0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
22ee0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
22ef0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
22f00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
22f10 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
22f20 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
22f30 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73  pecified UTF-8 s
22f40 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20  tring buffer.** 
22f50 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65  ends with a dire
22f60 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
22f70 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65  character or one
22f80 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
22f90 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74  y.** added to it
22fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22fb0 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
22fc0 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  ep(int nBuf, cha
22fd0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20  r *zBuf){.  if( 
22fe0 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  zBuf ){.    int 
22ff0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
23000 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
23010 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a    if( nLen>0 ){.
23020 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
23030 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d  irSep(zBuf[nLen-
23040 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  1]) ){.        r
23050 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
23060 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c  else if( nLen+1<
23070 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
23080 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e  zBuf[nLen] = win
23090 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20  GetDirSep();.   
230a0 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31       zBuf[nLen+1
230b0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
230c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
230d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
230e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
230f0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
23100 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
23110 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
23120 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20  sulting pointer 
23130 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54  into pzBuf..** T
23140 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
23150 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73  ned in pzBuf mus
23160 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73  t be freed via s
23170 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
23180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
23190 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
231a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
231b0 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20  har **pzBuf){.  
231c0 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
231d0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
231e0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
231f0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
23200 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
23210 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
23220 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
23230 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
23240 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74  nPre = sqlite3St
23250 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
23260 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
23270 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75  .  int nMax, nBu
23280 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20  f, nDir, nLen;. 
23290 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
232a0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
232b0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
232c0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
232d0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
232e0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
232f0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
23300 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
23310 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
23320 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
23330 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
23340 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
23350 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
23360 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
23370 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
23380 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
23390 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
233a0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66  ully qualified f
233b0 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f  ile.  ** name fo
233c0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
233d0 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20 66  file.  If this f
233e0 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20  ails, we cannot 
233f0 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20  continue..  */. 
23400 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78   nMax = pVfs->mx
23410 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d  Pathname; nBuf =
23420 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75   nMax + 2;.  zBu
23430 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f = sqlite3Mallo
23440 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20  cZero( nBuf );. 
23450 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20   if( !zBuf ){.  
23460 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
23470 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
23480 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
23490 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  n"));.    return
234a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
234b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
234c0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
234d0 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d  he effective tem
234e0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
234f0 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
23500 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20  if one.  ** has 
23510 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20  been explicitly 
23520 73 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69  set by the appli
23530 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73  cation; otherwis
23540 65 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20  e, use the one. 
23550 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62   ** configured b
23560 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  y the operating 
23570 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  system..  */.  n
23580 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50  Dir = nMax - (nP
23590 72 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65  re + 15);.  asse
235a0 72 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20  rt( nDir>0 );.  
235b0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
235c0 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
235d0 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20    int nDirLen = 
235e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
235f0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
23600 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28  ectory);.    if(
23610 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20   nDirLen>0 ){.  
23620 20 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69      if( !winIsDi
23630 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d  rSep(sqlite3_tem
23640 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72  p_directory[nDir
23650 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
23660 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20     nDirLen++;.  
23670 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23680 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a  nDirLen>nDir ){.
23690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
236a0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
236b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
236c0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
236d0 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
236e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
236f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
23700 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
23710 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c  inGetTempname1",
23720 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
23730 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
23740 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
23750 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65  "%s", sqlite3_te
23760 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
23770 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66     }.  }.#if def
23780 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
23790 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61  .  else{.    sta
237a0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
237b0 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
237c0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
237d0 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
237e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
237f0 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  * getenv("TMPDIR
23800 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
23810 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29  /* getenv("TMP")
23820 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
23830 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20   getenv("TEMP") 
23840 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
23850 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46  getenv("USERPROF
23860 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  ILE") */.       
23870 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
23880 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
23890 20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20        "/tmp",.  
238a0 20 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20       ".",.      
238b0 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73   0        /* Lis
238c0 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
238d0 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67      };.    unsig
238e0 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63  ned int i;.    c
238f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
23900 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61  = 0;..    if( !a
23910 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72  zDirs[0] ) azDir
23920 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[0] = getenv("S
23930 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
23940 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
23950 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d  1] ) azDirs[1] =
23960 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
23970 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
23980 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32  rs[2] ) azDirs[2
23990 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22  ] = getenv("TMP"
239a0 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
239b0 72 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33  rs[3] ) azDirs[3
239c0 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50  ] = getenv("TEMP
239d0 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
239e0 69 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b  irs[4] ) azDirs[
239f0 34 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45  4] = getenv("USE
23a00 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20  RPROFILE");.    
23a10 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
23a20 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
23a30 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69  (azDirs[0]); zDi
23a40 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a  r=azDirs[i++]){.
23a50 20 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e        void *zCon
23a60 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66  verted;.      if
23a70 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
23a80 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49  inue;.      /* I
23a90 66 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74  f the path start
23aa0 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c  s with a drive l
23ab0 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  etter followed b
23ac0 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20  y the colon.    
23ad0 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
23ae0 61 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72  assume it is alr
23af0 65 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69  eady a native Wi
23b00 6e 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77  n32 path; otherw
23b10 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ise,.      ** it
23b20 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74   must be convert
23b30 65 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57  ed to a native W
23b40 69 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68  in32 path via th
23b50 65 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20  e Cygwin API.   
23b60 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75     ** prior to u
23b70 73 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a  sing it..      *
23b80 2f 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49  /.      if( winI
23b90 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
23ba0 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20  olon(zDir) ){.  
23bb0 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
23bc0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
23bd0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44  mUtf8Filename(zD
23be0 69 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ir);.        if(
23bf0 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a   !zConverted ){.
23c00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23c10 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
23c20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
23c30 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
23c40 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
23c50 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
23c60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23c70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
23c80 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
23c90 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49          if( winI
23ca0 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
23cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
23cc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
23cd0 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
23ce0 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20   zDir);.        
23cf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23d00 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
23d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
23d30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
23d40 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  verted);.      }
23d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
23d60 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74  onverted = sqlit
23d70 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
23d80 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ax+1 );.        
23d90 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20  if( !zConverted 
23da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23db0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
23dc0 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41  .          OSTRA
23dd0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
23de0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
23df0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
23e00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23e20 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
23e30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
23e40 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
23e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23e60 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f   osIsNT() ? CCP_
23e70 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
23e80 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
23e90 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20  N_A, zDir,.     
23ea0 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76             zConv
23eb0 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30  erted, nMax+1)<0
23ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
23ed0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
23ee0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
23ef0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23f00 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
23f10 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23f20 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
23f30 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
23f40 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
23f50 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
23f60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
23f70 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
23f80 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d        "winGetTem
23fb0 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a  pname2", zDir);.
23fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23fd0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
23fe0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
23ff0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
24000 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
24010 77 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  w the candidate 
24020 64 69 72 65 63 74 6f 72 79 20 65 78 69 73 74 73  directory exists
24030 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20   and should.    
24040 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
24050 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d  .  However, we m
24060 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65  ay need to conve
24070 72 74 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f  rt the string co
24080 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20  ntaining.       
24090 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69     ** its name i
240a0 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20  nto UTF-8 (i.e. 
240b0 69 66 20 69 74 20 69 73 20 55 54 46 2d 31 36 20  if it is UTF-16 
240c0 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20  right now)..    
240d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
240e0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
240f0 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
24100 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65  8Filename(zConve
24110 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
24120 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
24130 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24140 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
24150 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
24160 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
24170 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  uf);.           
24180 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
24190 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
241a0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
241b0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "));.           
241c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
241d0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
241e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
241f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
24200 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
24210 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
24220 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
24230 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
24240 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
24250 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
24260 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
24270 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
24280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24290 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
242a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
242b0 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54    }.#elif !SQLIT
242c0 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
242d0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
242e0 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73  _).  else if( os
242f0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  IsNT() ){.    ch
24300 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
24310 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68  LPWSTR zWidePath
24320 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
24330 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f  Zero( nMax*sizeo
24340 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20  f(WCHAR) );.    
24350 69 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29  if( !zWidePath )
24360 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24370 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
24380 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
24390 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
243a0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
243b0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
243c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
243d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
243e0 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
243f0 65 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a  empPathW(nMax, z
24400 57 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a  WidePath)==0 ){.
24410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24420 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
24430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24440 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
24450 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
24460 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
24470 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
24480 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
24490 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
244a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
244b0 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
244c0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
244f0 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20  mpname2", 0);.  
24500 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d    }.    zMulti =
24510 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
24520 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  8(zWidePath);.  
24530 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a    if( zMulti ){.
24540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
24550 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
24560 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29  f, "%s", zMulti)
24570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24580 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
24590 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
245a0 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
245b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
245c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
245d0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Path);.      sql
245e0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
245f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
24600 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
24610 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
24620 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
24630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
24640 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
24650 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
24660 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
24670 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
24680 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b      char *zUtf8;
24690 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73  .    char *zMbcs
246a0 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
246b0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29  llocZero( nMax )
246c0 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73  ;.    if( !zMbcs
246d0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71  Path ){.      sq
246e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
246f0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
24700 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
24710 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
24720 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
24730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24740 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
24750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24760 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e  osGetTempPathA(n
24770 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d  Max, zMbcsPath)=
24780 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
24790 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
247a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
247b0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
247c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
247d0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
247e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
247f0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24800 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
24810 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
24820 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
24830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
24840 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c  inGetTempname3",
24850 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
24860 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77  Utf8 = sqlite3_w
24870 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
24880 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  8(zMbcsPath);.  
24890 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20    if( zUtf8 ){. 
248a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
248b0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
248c0 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
248d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
248e0 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d  ee(zUtf8);.    }
248f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
24900 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
24910 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
24920 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
24930 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
24940 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
24950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
24960 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
24970 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
24980 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
24990 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e  _HAS_ANSI */.#en
249a0 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
249b0 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a  S_WINRT */..  /*
249c0 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  ** Check to m
249d0 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d  ake sure the tem
249e0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
249f0 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70   ends with an ap
24a00 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73  propriate.  ** s
24a10 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74  eparator.  If it
24a20 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68   does not and th
24a30 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67  ere is not enoug
24a40 68 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20  h space left to 
24a50 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61  add.  ** one, fa
24a60 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  il..  */.  if( !
24a70 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
24a80 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29  ep(nDir+1, zBuf)
24a90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24aa0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
24ab0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
24ac0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
24ad0 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
24ae0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
24af0 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
24b00 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
24b10 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d  pname4", 0);.  }
24b20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63  ..  /*.  ** Chec
24b30 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
24b40 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
24b50 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
24b60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a   temporary file.
24b70 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65    ** name in the
24b80 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61   following forma
24b90 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22  t:.  **.  **   "
24ba0 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  <temporary_direc
24bb0 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58  tory>/etilqs_XXX
24bc0 58 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30  XXXXXXXXXXXX\0\0
24bd0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e  ".  **.  ** If n
24be0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
24bf0 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75  E_ERROR.  The nu
24c00 6d 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20  mber 17 is used 
24c10 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  here in order to
24c20 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f  .  ** account fo
24c30 72 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  r the space used
24c40 20 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61   by the 15 chara
24c50 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66  cter random suff
24c60 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  ix and the.  ** 
24c70 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c  two trailing NUL
24c80 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68   characters.  Th
24c90 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72  e final director
24ca0 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
24cb0 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61  acter.  ** has a
24cc0 6c 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20  lready added if 
24cd0 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61  it was not alrea
24ce0 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f  dy present..  */
24cf0 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65  .  nLen = sqlite
24d00 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
24d10 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e  .  if( (nLen + n
24d20 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66  Pre + 17) > nBuf
24d30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24d40 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
24d50 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
24d60 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
24d70 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
24d80 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
24d90 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
24da0 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
24db0 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d  pname5", 0);.  }
24dc0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
24dd0 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65  intf(nBuf-16-nLe
24de0 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51  n, zBuf+nLen, SQ
24df0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
24e00 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73  REFIX);..  j = s
24e10 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
24e20 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
24e30 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
24e40 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
24e50 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
24e60 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
24e70 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
24e80 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
24e90 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
24ea0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
24eb0 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
24ec0 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20   0;.  zBuf[j+1] 
24ed0 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20  = 0;.  *pzBuf = 
24ee0 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45  zBuf;..  OSTRACE
24ef0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
24f00 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
24f10 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29  ITE_OK\n", zBuf)
24f20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
24f30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24f40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
24f50 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73  he named file is
24f60 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74   really a direct
24f70 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  ory.  Return fal
24f80 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73  se if.** it is s
24f90 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
24fa0 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c  han a directory,
24fb0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
24fc0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f  any kind of memo
24fd0 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
24fe0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
24ff0 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
25000 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f  (const void *zCo
25010 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52  nverted){.  DWOR
25020 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
25030 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61   = 0;.  DWORD la
25040 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20  stErrno;..  if( 
25050 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
25060 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
25070 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
25080 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
25090 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
250a0 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
250b0 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
250c0 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
250d0 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
250e0 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
250f0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
25100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
25120 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
25130 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20     &sAttrData)) 
25160 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  && winRetryIoerr
25170 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
25180 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21  o) ){}.    if( !
25190 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
251a0 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64  rn 0; /* Invalid
251b0 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a   name? */.    }.
251c0 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
251d0 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
251e0 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54  butes;.#if SQLIT
251f0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
25200 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
25210 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
25220 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
25230 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
25240 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  f.  }.  return (
25250 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
25260 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26  LE_ATTRIBUTES) &
25270 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54  & (attr&FILE_ATT
25280 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
25290 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
252a0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
252b0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
252c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
252d0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55  Vfs,        /* U
252e0 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d  sed to get maxim
252f0 75 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e  um path name len
25300 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  gth */.  const c
25310 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
25320 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
25330 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
25340 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
25350 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
25360 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
25370 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
25380 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
25390 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
253a0 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66    /* Open mode f
253b0 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
253c0 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
253d0 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65      /* Status re
253e0 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  turn flags */.){
253f0 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44  .  HANDLE h;.  D
25400 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
25410 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65   0;.  DWORD dwDe
25420 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44  siredAccess;.  D
25430 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65  WORD dwShareMode
25440 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61  ;.  DWORD dwCrea
25450 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b  tionDisposition;
25460 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
25470 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
25480 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  0;.#if SQLITE_OS
25490 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54  _WINCE.  int isT
254a0 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  emp = 0;.#endif.
254b0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
254c0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
254d0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
254e0 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
254f0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
25500 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a   OS encoding */.
25510 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
25520 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  tf8Name = zName;
25530 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
25540 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a  UTF-8 encoding *
25550 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
25560 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65  ..  /* If argume
25570 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55  nt zPath is a NU
25580 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  LL pointer, this
25590 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71   function is req
255a0 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20  uired to open.  
255b0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
255c0 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75  ile. Use this bu
255d0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
255e0 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a  e file name in..
255f0 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d    */.  char *zTm
25600 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f  pname = 0; /* Fo
25610 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
25620 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61  name, if necessa
25630 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63  ry. */..  int rc
25640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
25650 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
25660 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
25670 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
25680 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49  (NDEBUG) || SQLI
25690 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
256a0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
256b0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
256c0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
256d0 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  open */.#endif..
256e0 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
256f0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
25700 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
25710 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
25720 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
25730 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
25740 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
25750 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
25760 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
25770 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
25780 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
25790 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
257a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
257b0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
257c0 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
257d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
257e0 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23  N_READWRITE);..#
257f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
25800 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  int isOpenJourna
25810 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  l = (isCreate &&
25820 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
25830 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
25840 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  STER_JOURNAL.   
25850 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
25860 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
25870 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79  RNAL.     || eTy
25880 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
25890 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66  WAL.  ));.#endif
258a0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
258b0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c  EN name=%s, pFil
258c0 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%p, flags=%x, 
258d0 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c  pOutFlags=%p\n",
258e0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 74 66  .           zUtf
258f0 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73  8Name, id, flags
25900 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a  , pOutFlags));..
25910 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
25920 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
25930 6e 74 73 20 61 72 65 20 74 72 75 65 3a 0a 20 20  nts are true:.  
25940 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
25950 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
25960 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
25970 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
25980 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  st be set, and. 
25990 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
259a0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
259b0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
259c0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
259d0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
259e0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
259f0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
25a00 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
25a10 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
25a20 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
25a30 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
25a40 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
25a50 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
25a60 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
25a70 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
25a80 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
25a90 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
25aa0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
25ab0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
25ac0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
25ad0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
25ae0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
25af0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
25b00 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
25b10 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
25b20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
25b30 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
25b40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
25b50 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75 74  e never.  ** aut
25b60 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
25b70 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
25b80 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
25b90 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
25ba0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
25bb0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
25bc0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
25bd0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
25be0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
25bf0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
25c00 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
25c10 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
25c20 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
25c30 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
25c40 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
25c50 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
25c60 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
25c70 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
25c80 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
25c90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
25ca0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
25cb0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
25cc0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
25cd0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
25ce0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
25cf0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
25d00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
25d10 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
25d20 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
25d30 4d 50 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  MP_DB.       || 
25d40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25d50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
25d60 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
25d70 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
25d80 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  AL.       || eTy
25d90 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
25da0 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
25db0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25dc0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
25dd0 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  L.       || eTyp
25de0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
25df0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
25e00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
25e10 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73  N_WAL.  );..  as
25e20 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
25e30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
25e40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46  , 0, sizeof(winF
25e50 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  ile));.  pFile->
25e60 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
25e70 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53  LE_VALUE;..#if S
25e80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
25e90 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
25ea0 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70  && !sqlite3_temp
25eb0 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
25ec0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
25ed0 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20  LITE_ERROR,.    
25ee0 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d      "sqlite3_tem
25ef0 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69  p_directory vari
25f00 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
25f10 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a  et for WinRT");.
25f20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
25f30 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
25f40 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
25f50 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
25f60 2c 20 67 65 6e 65 72 61 74 65 20 61 0a 20 20 2a  , generate a.  *
25f70 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
25f80 20 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a   name to use.  *
25f90 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
25fa0 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
25fb0 28 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  ( isDelete && !i
25fc0 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  sOpenJournal );.
25fd0 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54      rc = winGetT
25fe0 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a  empname(pVfs, &z
25ff0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
26000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26010 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
26020 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
26030 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61   rc=%s", zUtf8Na
26040 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
26050 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
26060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26070 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
26080 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
26090 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
260a0 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
260b0 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
260c0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
260d0 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74  ot.  ** URIs wit
260e0 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
260f0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
26100 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
26110 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
26120 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
26130 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
26140 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45  ( (eType!=SQLITE
26150 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
26160 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
26170 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20  E_OPEN_URI) ||. 
26180 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b        zUtf8Name[
26190 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
261a0 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30  zUtf8Name)+1]==0
261b0 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72   );..  /* Conver
261c0 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
261d0 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
261e0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
261f0 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
26200 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
26210 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
26220 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
26230 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
26240 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
26250 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
26260 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72  "OPEN name=%s, r
26270 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26280 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65  OMEM", zUtf8Name
26290 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
262a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
262b0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 69  M_BKPT;.  }..  i
262c0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
262d0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73  verted) ){.    s
262e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
262f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
26300 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
26310 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
26320 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
26330 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
26340 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66  PEN_ISDIR", zUtf
26350 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
26360 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
26370 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a  PEN_ISDIR;.  }..
26380 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
26390 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  e ){.    dwDesir
263a0 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
263b0 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
263c0 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
263d0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
263e0 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
263f0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
26400 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
26410 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f  USIVE is used to
26420 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
26430 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20 20  a new file is.  
26440 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
26450 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
26460 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
26470 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
26480 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75  .  ** as it is u
26490 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f  sually understoo
264a0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
264b0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
264c0 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65   /* Creates a ne
264d0 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  w file, only if 
264e0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
264f0 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20  ady exist. */.  
26500 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
26510 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c   exists, it fail
26520 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
26530 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
26540 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20  = CREATE_NEW;.  
26550 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61  }else if( isCrea
26560 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  te ){.    /* Ope
26570 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c  n existing file,
26580 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74   or create if it
26590 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
265a0 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
265b0 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
265c0 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c  EN_ALWAYS;.  }el
265d0 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73  se{.    /* Opens
265e0 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66   a file, only if
265f0 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20   it exists. */. 
26600 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
26610 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
26620 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20  EXISTING;.  }.. 
26630 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
26640 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
26650 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
26660 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65  E;..  if( isDele
26670 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  te ){.#if SQLITE
26680 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
26690 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
266a0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
266b0 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
266c0 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
266d0 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
266e0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
266f0 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
26700 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
26730 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
26760 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
26770 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
26780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
26790 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
267a0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
267b0 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
267c0 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
267d0 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
267e0 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
267f0 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
26800 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
26810 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
26820 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
26830 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
26840 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
26850 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
26860 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
26870 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
26880 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  CESS;.#endif..  
26890 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
268a0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
268b0 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49  NRT.    CREATEFI
268c0 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
268d0 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64  AMETERS extended
268e0 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20  Parameters;.    
268f0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
26900 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65  rs.dwSize = size
26910 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45  of(CREATEFILE2_E
26920 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
26930 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  RS);.    extende
26940 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
26950 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20  leAttributes =. 
26960 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
26970 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
26980 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
26990 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
269a0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
269b0 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c  FileFlags = dwFl
269c0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
269d0 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53   & FILE_FLAG_MAS
269e0 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
269f0 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75  arameters.dwSecu
26a00 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53  rityQosFlags = S
26a10 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55  ECURITY_ANONYMOU
26a20 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  S;.    extendedP
26a30 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75  arameters.lpSecu
26a40 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d  rityAttributes =
26a50 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e   NULL;.    exten
26a60 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54  dedParameters.hT
26a70 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55  emplateFile = NU
26a80 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  LL;.    while( (
26a90 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
26aa0 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  2((LPCWSTR)zConv
26ab0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
26ae0 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b00 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
26b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
26b30 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
26b40 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72      &extendedPar
26b70 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c  ameters))==INVAL
26b80 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
26b90 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
26bc0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
26bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26be0 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
26bf0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68    }.#else.    wh
26c00 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
26c10 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
26c20 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
26c50 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
26c80 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
26cb0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
26cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
26cf0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
26d20 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
26d30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
26d60 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26d70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
26d80 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
26d90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
26da0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
26db0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
26dc0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
26dd0 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
26de0 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76  eA((LPCSTR)zConv
26df0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
26e20 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e40 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
26e50 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e70 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
26e80 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
26eb0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
26ee0 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
26ef0 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
26f20 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
26f30 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
26f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f50 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20   Noop */.    }. 
26f60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c   }.#endif.  winL
26f70 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c  ogIoerr(cnt, __L
26f80 49 4e 45 5f 5f 29 3b 0a 0a 20 20 4f 53 54 52 41  INE__);..  OSTRA
26f90 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
26fa0 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
26fb0 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22  ss=%lx, rc=%s\n"
26fc0 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a  , h, zUtf8Name,.
26fd0 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
26fe0 69 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d  iredAccess, (h==
26ff0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
27000 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
27010 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66   : "ok"));..  if
27020 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
27030 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
27040 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
27050 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
27060 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
27070 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
27080 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
27090 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74  , "winOpen", zUt
270a0 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  f8Name);.    sql
270b0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
270c0 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
270d0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
270e0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  );.    if( isRea
270f0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
27100 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
27110 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70  return winOpen(p
27120 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a  Vfs, zName, id,.
27130 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
27140 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
27150 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20  DONLY) &.       
27160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28                ~(
27170 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
27180 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
27190 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20  EADWRITE)),.    
271a0 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b       pOutFlags);
271b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
271c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
271d0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
271e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
271f0 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
27200 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
27210 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
27220 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
27230 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
27240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
27250 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
27260 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
27270 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f  ;.    }.  }..  O
27280 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69  STRACE(("OPEN fi
27290 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20  le=%p, name=%s, 
272a0 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74  access=%lx, pOut
272b0 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46  Flags=%p, *pOutF
272c0 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20  lags=%d, ".     
272d0 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c        "rc=%s\n",
272e0 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64   h, zUtf8Name, d
272f0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
27300 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46  pOutFlags, pOutF
27310 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20  lags ?.         
27320 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30    *pOutFlags : 0
27330 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
27340 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
27350 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
27360 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
27370 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65  WINCE.  if( isRe
27380 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
27390 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
273a0 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20  IN_DB.       && 
273b0 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74  (rc = winceCreat
273c0 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
273d0 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  le))!=SQLITE_OK.
273e0 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65    ){.    osClose
273f0 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
27400 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
27410 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
27420 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
27430 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
27440 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20  (("OPEN-CE-LOCK 
27450 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
27460 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  ", zName, sqlite
27470 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
27480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27490 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
274a0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44  ){.    pFile->zD
274b0 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  eleteOnClose = z
274c0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c  Converted;.  }el
274d0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
274e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
274f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
27500 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27510 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69  zTmpname);.  pFi
27520 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77  le->pMethod = &w
27530 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46  inIoMethod;.  pF
27540 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
27550 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
27560 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
27570 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ly ){.    pFile-
27580 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
27590 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  NFILE_RDONLY;.  
275a0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
275b0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d  uri_boolean(zNam
275c0 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54  e, "psow", SQLIT
275d0 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
275e0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46  WRITE) ){.    pF
275f0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
27600 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a  = WINFILE_PSOW;.
27610 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73    }.  pFile->las
27620 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
27630 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  R;.  pFile->zPat
27640 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53  h = zName;.#if S
27650 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27660 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68  IZE>0.  pFile->h
27670 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46  Map = NULL;.  pF
27680 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
27690 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
276a0 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46  apSize = 0;.  pF
276b0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
276c0 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ual = 0;.  pFile
276d0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
276e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
276f0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
27700 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  if..  OpenCounte
27710 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
27720 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
27730 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
27740 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
27750 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
27760 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
27770 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
27780 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
27790 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
277a0 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
277b0 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
277c0 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
277d0 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
277e0 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
277f0 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
27800 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
27810 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
27820 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
27830 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
27840 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
27850 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
27860 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
27870 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
27880 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
27890 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
278a0 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
278b0 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
278c0 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
278d0 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
278e0 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
278f0 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
27900 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
27910 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
27920 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
27930 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
27940 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27950 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
27960 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
27970 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
27980 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
27990 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
279a0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
279b0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
279c0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
279d0 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
279e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
279f0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
27a00 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
27a10 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
27a20 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f  WORD attr;.  DWO
27a30 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
27a40 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
27a50 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
27a60 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
27a70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27a80 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20  ER(syncDir);..  
27a90 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
27aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
27ab0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f  ERR_DELETE);.  O
27ac0 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
27ad0 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72  name=%s, syncDir
27ae0 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%d\n", zFilenam
27af0 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20  e, syncDir));.. 
27b00 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
27b10 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
27b20 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
27b30 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
27b40 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
27b50 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
27b60 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
27b70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
27b80 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  n", zFilename));
27b90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27ba0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
27bb0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  KPT;.  }.  if( o
27bc0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64  sIsNT() ){.    d
27bd0 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
27be0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
27bf0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
27c00 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
27c10 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
27c20 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
27c30 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
27c40 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
27c50 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
27c60 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
27c70 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
27c80 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ca0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
27cb0 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
27cc0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
27cd0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
27ce0 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
27cf0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
27d00 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
27d10 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
27d20 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
27d30 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
27d40 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
27d50 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
27d60 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
27d70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
27d80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
27d90 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
27da0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
27db0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27dc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27dd0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
27de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
27df0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  eak;.      }.#el
27e00 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20  se.      attr = 
27e10 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
27e20 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
27e30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
27e40 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
27e50 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
27e60 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
27e70 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
27e80 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
27e90 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
27ea0 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
27eb0 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
27ec0 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
27ed0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
27ee0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
27ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
27f00 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
27f10 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
27f20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
27f30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
27f40 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
27f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27f60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27f70 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
27f80 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
27f90 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
27fa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27fb0 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
27fc0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
27fd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27fe0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
27ff0 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
28000 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
28010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28020 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
28030 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
28040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28050 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
28060 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
28070 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
28080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
28090 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
280a0 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
280b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
280c0 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
280d0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
280e0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
280f0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
28100 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d  o {.      attr =
28110 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
28120 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64  utesA(zConverted
28130 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
28140 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
28150 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
28160 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
28170 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
28180 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
28190 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
281a0 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
281b0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
281c0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
281d0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
281e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
281f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
28200 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
28210 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
28220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28230 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28240 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
28250 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
28260 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
28270 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
28280 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
28290 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
282a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
282b0 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
282c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
282d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
282e0 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
282f0 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
28300 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28310 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
28320 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
28330 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28340 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
28350 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
28360 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
28370 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28380 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
28390 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
283a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
283b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
283c0 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
283d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
283e0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
283f0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
28400 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
28410 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
28420 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61  IOERR_DELETE, la
28430 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c  stErrno, "winDel
28440 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
28450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
28460 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20  inLogIoerr(cnt, 
28470 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20  __LINE__);.  }. 
28480 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28490 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54  onverted);.  OST
284a0 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
284b0 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
284c0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69   zFilename, sqli
284d0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
284e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
284f0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
28500 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20  e existence and 
28510 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65  status of a file
28520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28530 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c  winAccess(.  sql
28540 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
28550 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
28560 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
28570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
28580 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
28590 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
285a0 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
285b0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
285c0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
285d0 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e   test to make on
285e0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
285f0 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
28600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28610 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a  T: Result */.){.
28620 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
28630 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57  int rc = 0;.  DW
28640 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
28650 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  0;.  void *zConv
28660 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
28670 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
28680 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
28690 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
286a0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
286b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
286c0 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
286d0 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75  flags=%x, pResOu
286e0 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%p\n",.       
286f0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66      zFilename, f
28700 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b  lags, pResOut));
28710 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ..  zConverted =
28720 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
28730 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
28740 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
28750 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
28760 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43     OSTRACE(("ACC
28770 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ESS name=%s, rc=
28780 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28790 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  EM\n", zFilename
287a0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
287b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
287c0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  M_BKPT;.  }.  if
287d0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
287e0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
287f0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
28800 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
28810 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
28820 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
28830 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
28840 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
28850 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
28860 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
28870 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
28880 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
288b0 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
288e0 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65  ) && winRetryIoe
288f0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
28900 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
28910 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
28920 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
28930 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
28940 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
28950 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
28960 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
28970 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
28980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
28990 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
289a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
289b0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
289c0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
289d0 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20 20  High==0.        
289e0 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
289f0 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29  FileSizeLow==0 )
28a00 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
28a10 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
28a20 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
28a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
28a40 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
28a50 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
28a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
28a70 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  lse{.      winLo
28a80 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49  gIoerr(cnt, __LI
28a90 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69 66 28  NE__);.      if(
28aa0 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
28ab0 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
28ac0 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
28ad0 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
28ae0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  UND ){.        s
28af0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28b00 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
28b10 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
28b20 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
28b30 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
28b40 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
28b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28b60 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
28b70 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
28b80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
28b90 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
28ba0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
28bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
28bc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
28bd0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
28be0 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
28bf0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
28c00 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
28c10 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
28c20 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
28c30 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28c40 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
28c50 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
28c60 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
28c70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
28c80 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
28c90 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
28ca0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
28cb0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72  IBUTES;.      br
28cc0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
28cd0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
28ce0 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20  WRITE:.      rc 
28cf0 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
28d00 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
28d10 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
28d20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  (attr & FILE_ATT
28d30 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29  RIBUTE_READONLY)
28d40 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ==0;.      break
28d50 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
28d60 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
28d70 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
28d80 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
28d90 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f  ResOut = rc;.  O
28da0 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
28db0 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74  name=%s, pResOut
28dc0 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64  =%p, *pResOut=%d
28dd0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
28de0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46  ",.           zF
28df0 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74  ilename, pResOut
28e00 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
28e10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28e30 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
28e40 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
28e50 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
28e60 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
28e70 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79  r.** followed by
28e80 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74   a colon charact
28e90 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  er..*/.static BO
28ea0 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  OL winIsDriveLet
28eb0 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63  terAndColon(.  c
28ec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
28ed0 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e  name.){.  return
28ee0 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68   ( sqlite3Isalph
28ef0 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  a(zPathname[0]) 
28f00 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d  && zPathname[1]=
28f10 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  =':' );.}../*.**
28f20 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
28f30 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
28f40 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  ed path name sho
28f50 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62  uld be used verb
28f60 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e  atim.  If.** non
28f70 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
28f80 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  d from this func
28f90 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e  tion, the callin
28fa0 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
28fb0 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68  simply.** use th
28fc0 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20  e provided path 
28fd0 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f  name verbatim -O
28fe0 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e  R- resolve it in
28ff0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e  to a full path n
29000 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ame.** using the
29010 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
29020 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74   Win32 API funct
29030 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c  ion (if availabl
29040 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  e)..*/.static BO
29050 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d  OL winIsVerbatim
29060 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
29070 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
29080 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  e.){.  /*.  ** I
29090 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
290a0 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f  starts with a fo
290b0 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61  rward slash or a
290c0 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69   backslash, it i
290d0 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20  s either.  ** a 
290e0 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20  legal UNC name, 
290f0 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  a volume relativ
29100 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62  e path, or an ab
29110 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65  solute path name
29120 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e   in the.  ** "Un
29130 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69  ix" format on Wi
29140 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73  ndows.  There is
29150 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20   no easy way to 
29160 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
29170 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66  tween.  ** the f
29180 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20  inal two cases; 
29190 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65  therefore, we re
291a0 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72  turn the safer r
291b0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
291c0 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  RUE.  ** so that
291d0 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   callers of this
291e0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
291f0 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72  imply use it ver
29200 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  batim..  */.  if
29210 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a   ( winIsDirSep(z
29220 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a  Pathname[0]) ){.
29230 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
29240 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
29250 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
29260 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c   starts with a l
29270 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f  etter and a colo
29280 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61  n it is either a
29290 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c   volume.  ** rel
292a0 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e  ative path or an
292b0 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20   absolute path. 
292c0 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   Callers of this
292d0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e   function must n
292e0 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20  ot.  ** attempt 
292f0 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61  to treat it as a
29300 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
29310 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73  ame (i.e. they s
29320 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65  hould simply use
29330 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69  .  ** it verbati
29340 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  m)..  */.  if ( 
29350 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
29360 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61  AndColon(zPathna
29370 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  me) ){.    retur
29380 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
29390 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74  *.  ** If we get
293a0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
293b0 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68  the path name sh
293c0 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74  ould almost cert
293d0 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c  ainly be a purel
293e0 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  y.  ** relative 
293f0 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20  one (i.e. not a 
29400 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62  UNC name, not ab
29410 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20  solute, and not 
29420 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29  volume relative)
29430 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
29440 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FALSE;.}../*.** 
29450 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
29460 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
29470 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
29480 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
29490 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
294a0 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
294b0 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
294c0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
294d0 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
294e0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
294f0 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
29500 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
29510 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
29520 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
29530 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
29540 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
29550 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
29560 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
29570 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
29580 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
295b0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
295c0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
295d0 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
295e0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
295f0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23   buffer */.){..#
29600 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
29610 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
29620 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
29630 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
29640 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29650 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
29660 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
29670 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
29680 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
29690 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
296a0 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
296b0 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
296c0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
296d0 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
296e0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
296f0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
29700 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
29710 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
29720 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
29730 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
29740 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
29750 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
29760 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
29770 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
29780 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
29790 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
297a0 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
297b0 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
297c0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
297d0 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
297e0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
297f0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
29800 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
29810 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
29820 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
29830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
29840 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
29850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67     }.    if( cyg
29860 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
29870 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49 73             (osIs
29880 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58  NT() ? CCP_POSIX
29890 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f  _TO_WIN_W : CCP_
298a0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20  POSIX_TO_WIN_A) 
298b0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 43  |.            CC
298c0 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c  P_RELATIVE, zRel
298d0 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66  ative, zOut, pVf
298e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
298f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
29900 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
29910 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
29920 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
29930 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
29940 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c  H, (DWORD)errno,
29950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29960 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
29970 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
29980 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65  elative);.    }e
29990 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
299a0 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76  *zUtf8 = winConv
299b0 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
299c0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  e(zOut);.      i
299d0 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20  f( !zUtf8 ){.   
299e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
299f0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  e(zOut);.       
29a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29a10 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
29a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
29a30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29a40 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
29a50 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
29a60 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
29a90 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
29aa0 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55  nGetDirSep(), zU
29ab0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
29ac0 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
29ad0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
29ae0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
29af0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
29b00 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
29b10 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
29b20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
29b30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
29b40 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
29b50 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29b60 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
29b70 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
29b80 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
29b90 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
29ba0 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
29bb0 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
29bc0 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20  X_TO_WIN_A),.   
29bd0 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69           zRelati
29be0 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e  ve, zOut, pVfs->
29bf0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
29c00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29c10 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
29c20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
29c30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
29c40 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
29c50 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c70 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
29c80 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
29c90 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tive);.    }else
29ca0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
29cb0 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
29cc0 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
29cd0 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
29ce0 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
29cf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29d00 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
29d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
29d20 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
29d30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
29d40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
29d50 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
29d60 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
29d70 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
29d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29d90 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ee(zUtf8);.     
29da0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
29db0 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ut);.    }.  }. 
29dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29dd0 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28  K;.#endif..#if (
29de0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
29df0 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
29e00 52 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  RT) && !defined(
29e10 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
29e20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
29e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29e40 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  OR );.  /* WinCE
29e50 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
29e60 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
29e70 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
29e80 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a  am told. */.  /*
29e90 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61   WinRT has no wa
29ea0 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72  y to convert a r
29eb0 65 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20  elative path to 
29ec0 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e  an absolute one.
29ed0 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74   */.  if ( sqlit
29ee0 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
29ef0 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
29f00 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
29f10 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
29f20 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
29f30 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
29f40 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
29f50 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
29f60 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
29f70 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
29f80 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
29f90 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
29fa0 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
29fb0 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
29fc0 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
29fd0 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
29fe0 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
29ff0 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
2a000 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
2a010 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
2a020 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20   a backslash..  
2a030 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2a040 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
2a050 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
2a060 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
2a070 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%c%s",.       
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2a090 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2a0a0 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53  tory, winGetDirS
2a0b0 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29  ep(), zRelative)
2a0c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2a0d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2a0e0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2a0f0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2a100 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61  ull, "%s", zRela
2a110 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tive);.  }.  ret
2a120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2a130 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
2a140 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
2a150 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2a160 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
2a170 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20  GWIN__).  DWORD 
2a180 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
2a190 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
2a1a0 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  r *zOut;..  /* I
2a1b0 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65  f this path name
2a1c0 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58   begins with "/X
2a1d0 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73  :", where "X" is
2a1e0 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a   any alphabetic.
2a1f0 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
2a200 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74  discard the init
2a210 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65  ial "/" from the
2a220 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   pathname..  */.
2a230 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
2a240 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e 49 73  0]=='/' && winIs
2a250 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
2a260 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b 31 29  lon(zRelative+1)
2a270 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76   ){.    zRelativ
2a280 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  e++;.  }..  /* I
2a290 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2a2a0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2a2b0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2a2c0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2a2d0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2a2e0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2a2f0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2a300 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2a310 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2a320 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
2a330 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
2a340 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
2a350 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
2a360 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
2a370 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2a380 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
2a390 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
2a3a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2a3b0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
2a3c0 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
2a3d0 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
2a3e0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
2a3f0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
2a400 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2a410 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
2a420 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
2a430 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
2a440 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
2a450 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
2a460 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
2a470 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
2a480 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
2a490 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
2a4a0 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
2a4b0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
2a4c0 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
2a4d0 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
2a4e0 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
2a4f0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
2a500 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
2a510 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
2a520 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2a530 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2a540 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2a550 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
2a560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a570 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
2a580 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
2a590 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52  nGetDirSep(), zR
2a5a0 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65  elative);.    re
2a5b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a5c0 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64    }.  zConverted
2a5d0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2a5e0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  mUtf8Filename(zR
2a5f0 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
2a600 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
2a610 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a620 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2a630 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  KPT;.  }.  if( o
2a640 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c  sIsNT() ){.    L
2a650 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
2a660 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
2a670 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
2a680 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
2a690 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
2a6a0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2a6b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2a6c0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2a6d0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2a6e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2a6f0 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
2a700 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
2a710 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
2a730 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c  nFullPathname1",
2a740 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2a750 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
2a760 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
2a770 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2a780 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
2a790 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
2a7a0 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
2a7b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a7c0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2a7d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a7e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2a7f0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2a800 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
2a810 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
2a820 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2a830 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
2a840 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
2a850 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2a860 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2a870 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
2a880 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
2a890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
2a8a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
2a8b0 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
2a8c0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
2a8d0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
2a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a8f0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
2a900 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
2a910 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a920 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2a930 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  );.    zOut = wi
2a940 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
2a950 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
2a960 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2a970 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2a980 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
2a990 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
2a9a0 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
2a9b0 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2a9c0 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
2a9d0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
2a9e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
2a9f0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
2aa00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2aa10 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2aa20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2aa30 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2aa40 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2aa50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa70 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2aa80 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c  Pathname3", zRel
2aa90 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2aaa0 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
2aab0 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
2aac0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
2aad0 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
2aae0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
2aaf0 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
2ab00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2ab10 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2ab20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ab30 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2ab40 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
2ab50 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
2ab60 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
2ab70 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
2ab80 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
2ab90 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2aba0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2abb0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2abc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2abd0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
2abe0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2abf0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2ac00 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2ac10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac30 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2ac40 50 61 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c  Pathname4", zRel
2ac50 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2ac60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ac70 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2ac80 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
2ac90 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
2aca0 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
2acb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
2acc0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2acd0 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20  if( zOut ){.    
2ace0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2acf0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2ad00 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2ad10 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74  Full, "%s", zOut
2ad20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2ad30 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72  ree(zOut);.    r
2ad40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ad50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2ad60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2ad70 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2ad80 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
2ad90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ada0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
2adb0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
2adc0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
2add0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
2ade0 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
2adf0 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
2ae00 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
2ae10 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
2ae20 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
2ae30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ae40 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74  *winDlOpen(sqlit
2ae50 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
2ae60 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2ae70 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ame){.  HANDLE h
2ae80 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
2ae90 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
2aea0 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78  nFull = pVfs->mx
2aeb0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68  Pathname+1;.  ch
2aec0 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69  ar *zFull = sqli
2aed0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
2aee0 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a  Full );.  void *
2aef0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
2af00 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29    if( zFull==0 )
2af10 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
2af20 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
2af30 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
2af40 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
2af50 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
2af60 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
2af70 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2af80 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
2af90 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c  ull, zFull)!=SQL
2afa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2afb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
2afc0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
2afd0 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
2afe0 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
2aff0 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
2b000 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
2b010 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65   0;.  }.  zConve
2b020 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
2b030 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
2b040 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  e(zFull);.  sqli
2b050 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b  te3_free(zFull);
2b060 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a  .#else.  void *z
2b070 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
2b080 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
2b090 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
2b0a0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2b0b0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e  METER(pVfs);.#en
2b0c0 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  dif.  if( zConve
2b0d0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
2b0e0 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2b0f0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2b100 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2b110 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
2b120 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2b130 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
2b140 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
2b150 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73  WINRT.    h = os
2b160 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
2b170 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ary((LPCWSTR)zCo
2b180 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c  nverted, 0);.#el
2b190 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  se.    h = osLoa
2b1a0 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53  dLibraryW((LPCWS
2b1b0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  TR)zConverted);.
2b1c0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
2b1d0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
2b1e0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
2b1f0 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
2b200 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43  braryA((char*)zC
2b210 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23  onverted);.  }.#
2b220 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28  endif.  OSTRACE(
2b230 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
2b240 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
2b250 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
2b260 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  *)h));.  sqlite3
2b270 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2b280 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
2b290 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76  d*)h;.}.static v
2b2a0 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73  oid winDlError(s
2b2b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2b2c0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2b2d0 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e   *zBufOut){.  UN
2b2e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b2f0 56 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61  Vfs);.  winGetLa
2b300 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
2b310 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
2b320 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73  f, zBufOut);.}.s
2b330 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e  tatic void (*win
2b340 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
2b350 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48  s *pVfs,void *pH
2b360 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79  ,const char *zSy
2b370 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52  m))(void){.  FAR
2b380 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55  PROC proc;.  UNU
2b390 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2b3a0 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73  fs);.  proc = os
2b3b0 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
2b3c0 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d  (HANDLE)pH, zSym
2b3d0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
2b3e0 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20  LSYM handle=%p, 
2b3f0 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65  symbol=%s, addre
2b400 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  ss=%p\n",.      
2b410 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20       (void*)pH, 
2b420 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f  zSym, (void*)pro
2b430 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  c));.  return (v
2b440 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f  oid(*)(void))pro
2b450 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
2b460 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69   winDlClose(sqli
2b470 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
2b480 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
2b490 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b4a0 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65  R(pVfs);.  osFre
2b4b0 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
2b4c0 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54  )pHandle);.  OST
2b4d0 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68  RACE(("DLCLOSE h
2b4e0 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f  andle=%p\n", (vo
2b4f0 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d  id*)pHandle));.}
2b500 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
2b510 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
2b520 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
2b530 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
2b540 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20   winDlOpen  0.  
2b550 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72  #define winDlErr
2b560 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  or 0.  #define w
2b570 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  inDlSym   0.  #d
2b580 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65  efine winDlClose
2b590 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 74   0.#endif../* St
2b5a0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2b5b0 66 6f 72 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65  for the randomne
2b5c0 73 73 20 67 61 74 68 65 72 65 72 2e 20 2a 2f 0a  ss gatherer. */.
2b5d0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
2b5e0 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 45  ntropyGatherer E
2b5f0 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 3b 0a  ntropyGatherer;.
2b600 73 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61  struct EntropyGa
2b610 74 68 65 72 65 72 20 7b 0a 20 20 75 6e 73 69 67  therer {.  unsig
2b620 6e 65 64 20 63 68 61 72 20 2a 61 3b 20 20 20 2f  ned char *a;   /
2b630 2a 20 47 61 74 68 65 72 20 65 6e 74 72 6f 70 79  * Gather entropy
2b640 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
2b650 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 3b 20 20  r */.  int na;  
2b660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2b670 7a 65 20 6f 66 20 61 5b 5d 20 69 6e 20 62 79 74  ze of a[] in byt
2b680 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  es */.  int i;  
2b690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
2b6a0 4f 52 20 6e 65 78 74 20 69 6e 70 75 74 20 69 6e  OR next input in
2b6b0 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20 20 69 6e 74  to a[i] */.  int
2b6c0 20 6e 58 6f 72 3b 20 20 20 20 20 20 20 20 20 20   nXor;          
2b6d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 58 4f   /* Number of XO
2b6e0 52 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f 6e  R operations don
2b6f0 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 21 64 65  e */.};..#if !de
2b700 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2b710 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
2b720 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f  QLITE_OMIT_RANDO
2b730 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69 78 20 73 7a  MNESS)./* Mix sz
2b740 20 62 79 74 65 73 20 6f 66 20 65 6e 74 72 6f 70   bytes of entrop
2b750 79 20 69 6e 74 6f 20 70 2e 20 2a 2f 0a 73 74 61  y into p. */.sta
2b760 74 69 63 20 76 6f 69 64 20 78 6f 72 4d 65 6d 6f  tic void xorMemo
2b770 72 79 28 45 6e 74 72 6f 70 79 47 61 74 68 65 72  ry(EntropyGather
2b780 65 72 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20  er *p, unsigned 
2b790 63 68 61 72 20 2a 78 2c 20 69 6e 74 20 73 7a 29  char *x, int sz)
2b7a0 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20  {.  int j, k;.  
2b7b0 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70 2d 3e 69 3b  for(j=0, k=p->i;
2b7c0 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<sz; j++){.   
2b7d0 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e 3d 20 78 5b   p->a[k++] ^= x[
2b7e0 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  j];.    if( k>=p
2b7f0 2d 3e 6e 61 20 29 20 6b 20 3d 20 30 3b 0a 20 20  ->na ) k = 0;.  
2b800 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b 3b 0a 20 20  }.  p->i = k;.  
2b810 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73 7a 3b 0a 7d  p->nXor += sz;.}
2b820 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2b830 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
2b840 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
2b850 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
2b860 45 53 53 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  ESS) */../*.** W
2b870 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20  rite up to nBuf 
2b880 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e  bytes of randomn
2b890 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a  ess into zBuf..*
2b8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2b8b0 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74  Randomness(sqlit
2b8c0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2b8d0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2b8e0 75 66 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  uf){.#if defined
2b8f0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
2b900 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b910 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
2b920 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b930 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d  TER(pVfs);.  mem
2b940 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
2b950 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  f);.  return nBu
2b960 66 3b 0a 23 65 6c 73 65 0a 20 20 45 6e 74 72 6f  f;.#else.  Entro
2b970 70 79 47 61 74 68 65 72 65 72 20 65 3b 0a 20 20  pyGatherer e;.  
2b980 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b990 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74  (pVfs);.  memset
2b9a0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
2b9b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
2b9c0 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
2b9d0 45 52 3e 3d 31 34 30 30 20 26 26 20 21 53 51 4c  ER>=1400 && !SQL
2b9e0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72  ITE_OS_WINCE.  r
2b9f0 61 6e 64 5f 73 28 28 75 6e 73 69 67 6e 65 64 20  and_s((unsigned 
2ba00 69 6e 74 2a 29 7a 42 75 66 29 3b 20 2f 2a 20 72  int*)zBuf); /* r
2ba10 61 6e 64 5f 73 28 29 20 69 73 20 6e 6f 74 20 61  and_s() is not a
2ba20 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 4d 69  vailable with Mi
2ba30 6e 47 57 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  nGW */.#endif /*
2ba40 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45   defined(_MSC_VE
2ba50 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e 3d  R) && _MSC_VER>=
2ba60 31 34 30 30 20 2a 2f 0a 20 20 65 2e 61 20 3d 20  1400 */.  e.a = 
2ba70 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2ba80 7a 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e  zBuf;.  e.na = n
2ba90 42 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d 20  Buf;.  e.nXor = 
2baa0 30 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20 20  0;.  e.i = 0;.  
2bab0 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
2bac0 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73   x;.    osGetSys
2bad0 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20  temTime(&x);.   
2bae0 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2baf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2bb00 78 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  x, sizeof(SYSTEM
2bb10 54 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b 0a  TIME));.  }.  {.
2bb20 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
2bb30 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
2bb40 65 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f 72  essId();.    xor
2bb50 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2bb60 67 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64 2c  gned char*)&pid,
2bb70 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b   sizeof(DWORD));
2bb80 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
2bb90 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
2bba0 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d   ULONGLONG cnt =
2bbb0 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
2bbc0 34 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  4();.    xorMemo
2bbd0 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2bbe0 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a   char*)&cnt, siz
2bbf0 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29 3b  eof(ULONGLONG));
2bc00 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20  .  }.#else.  {. 
2bc10 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f     DWORD cnt = o
2bc20 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b  sGetTickCount();
2bc30 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2bc40 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2bc50 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  r*)&cnt, sizeof(
2bc60 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65 6e  DWORD));.  }.#en
2bc70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
2bc80 5f 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20 20  _WINRT */.  {.  
2bc90 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
2bca0 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65  i;.    osQueryPe
2bcb0 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
2bcc0 28 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  (&i);.    xorMem
2bcd0 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2bce0 64 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a 65  d char*)&i, size
2bcf0 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
2bd00 29 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c  ));.  }.#if !SQL
2bd10 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2bd20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
2bd30 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
2bd40 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20 20  _USE_UUID.  {.  
2bd50 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d    UUID id;.    m
2bd60 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69  emset(&id, 0, si
2bd70 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20  zeof(UUID));.   
2bd80 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26 69   osUuidCreate(&i
2bd90 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  d);.    xorMemor
2bda0 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2bdb0 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f  char*)&id, sizeo
2bdc0 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d 65  f(UUID));.    me
2bdd0 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a  mset(&id, 0, siz
2bde0 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20  eof(UUID));.    
2bdf0 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75  osUuidCreateSequ
2be00 65 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20 20  ential(&id);.   
2be10 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2be20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2be30 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29  id, sizeof(UUID)
2be40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
2be50 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
2be60 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
2be70 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
2be80 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20 2a  WIN32_USE_UUID *
2be90 2f 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58 6f  /.  return e.nXo
2bea0 72 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a 20  r>nBuf ? nBuf : 
2beb0 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20 2f  e.nXor;.#endif /
2bec0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
2bed0 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
2bee0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41  d(SQLITE_OMIT_RA
2bef0 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a 0a  NDOMNESS) */.}..
2bf00 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
2bf10 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
2bf20 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
2bf30 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
2bf40 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2bf50 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65   winSleep(sqlite
2bf60 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2bf70 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71   microsec){.  sq
2bf80 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
2bf90 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29  p((microsec+999)
2bfa0 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44  /1000);.  UNUSED
2bfb0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2bfc0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63  ;.  return ((mic
2bfd0 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
2bfe0 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *1000;.}../*.** 
2bff0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
2c000 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
2c010 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
2c020 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
2c030 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
2c040 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
2c050 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
2c060 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
2c070 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
2c080 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
2c090 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
2c0a0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
2c0b0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2c0c0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2c0d0 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
2c0e0 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
2c0f0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2c100 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
2c110 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2c120 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2c130 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2c140 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2c150 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
2c160 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
2c170 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2c180 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2c190 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
2c1a0 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
2c1b0 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
2c1c0 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
2c1d0 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
2c1e0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
2c1f0 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
2c200 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
2c210 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
2c220 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
2c230 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
2c240 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
2c250 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
2c260 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
2c270 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
2c280 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  _OK.  Return SQL
2c290 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65  ITE_ERROR if the
2c2a0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a   time and date.*
2c2b0 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  * cannot be foun
2c2c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c2d0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2c2e0 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
2c2f0 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
2c300 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
2c310 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
2c320 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
2c330 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
2c340 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
2c350 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e   of.     100-nan
2c360 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
2c370 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
2c380 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
2c390 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20  05813.5)..  */. 
2c3a0 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
2c3b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2c3c0 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
2c3d0 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
2c3e0 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
2c3f0 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
2c400 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2c410 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
2c420 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
2c430 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
2c440 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
2c450 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
2c460 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
2c470 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
2c480 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
2c490 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
2c4a0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2c4b0 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
2c4c0 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c  lue =.      (sql
2c4d0 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
2c4e0 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
2c4f0 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
2c500 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74  0 +.      (sqlit
2c510 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32  e3_int64)2949672
2c520 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  96;..#if SQLITE_
2c530 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45  OS_WINCE.  SYSTE
2c540 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73  MTIME time;.  os
2c550 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74  GetSystemTime(&t
2c560 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79  ime);.  /* if Sy
2c570 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
2c580 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72  me() fails, it r
2c590 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eturns zero. */.
2c5a0 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54    if (!osSystemT
2c5b0 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74  imeToFileTime(&t
2c5c0 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72  ime,&ft)){.    r
2c5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2c5e0 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  OR;.  }.#else.  
2c5f0 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
2c600 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29  sFileTime( &ft )
2c610 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e  ;.#endif..  *piN
2c620 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65  ow = winFiletime
2c630 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20  Epoch +.        
2c640 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f      ((((sqlite3_
2c650 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44  int64)ft.dwHighD
2c660 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69  ateTime)*max32Bi
2c670 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20  tValue) +.      
2c680 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2c690 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
2c6a0 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
2c6b0 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
2c6c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2c6d0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
2c6e0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
2c6f0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
2c700 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
2c710 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
2c720 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
2c730 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
2c740 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2c750 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
2c760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2c770 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2c780 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2c790 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2c7a0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2c7b0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
2c7c0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2c7d0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2c7e0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
2c7f0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
2c800 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
2c810 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2c820 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
2c830 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2c840 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
2c850 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
2c860 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
2c870 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Now){.  int rc;.
2c880 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2c890 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72  i;.  rc = winCur
2c8a0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56  rentTimeInt64(pV
2c8b0 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21  fs, &i);.  if( !
2c8c0 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  rc ){.    *prNow
2c8d0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
2c8e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
2c900 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
2c910 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
2c920 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
2c930 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
2c940 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
2c950 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57  atMessage() on W
2c960 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
2c970 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
2c980 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41  _r() on Unix). A
2c990 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
2c9a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
2c9b0 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
2c9c0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
2c9d0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
2c9e0 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
2c9f0 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
2ca00 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
2ca10 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
2ca20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
2ca30 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
2ca40 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
2ca50 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
2ca60 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
2ca70 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
2ca80 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
2ca90 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e   occurred within
2caa0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
2cab0 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  thread..**.** If
2cac0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2cad0 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
2cae0 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64  for the supplied
2caf0 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73   buffer,.** it s
2cb00 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
2cb10 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ed. The return v
2cb20 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74  alue of xGetLast
2cb30 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  Error.** is zero
2cb40 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
2cb50 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
2cb60 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
2cb70 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
2cb80 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
2cb90 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
2cba0 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ). If non-zero i
2cbb0 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74  s returned,.** t
2cbc0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hen it is not ne
2cbd0 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75  cessary to inclu
2cbe0 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  de the nul-termi
2cbf0 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  nator character.
2cc00 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ** in the output
2cc10 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   buffer..**.** N
2cc20 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20  ot supplying an 
2cc30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
2cc40 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72  ll have no adver
2cc50 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20  se effect.** on 
2cc60 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69  SQLite. It is fi
2cc70 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d  ne to have an im
2cc80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
2cc90 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72  t never.** retur
2cca0 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ns an error mess
2ccb0 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74  age:.**.**   int
2ccc0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73   xGetLastError(s
2ccd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2cce0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2ccf0 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20   *zBuf){.**     
2cd00 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d  assert(zBuf[0]==
2cd10 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65  '\0');.**     re
2cd20 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a  turn 0;.**   }.*
2cd30 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20  *.** However if 
2cd40 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2cd50 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74   is supplied, it
2cd60 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f   will be incorpo
2cd70 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  rated.** by sqli
2cd80 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  te into the erro
2cd90 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61  r message availa
2cda0 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20  ble to the user 
2cdb0 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
2cdc0 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69  _errmsg(), possi
2cdd0 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72  bly making IO er
2cde0 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64  rors easier to d
2cdf0 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ebug..*/.static 
2ce00 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
2ce10 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2ce20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
2ce30 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2ce40 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c  DWORD e = osGetL
2ce50 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55 4e  astError();.  UN
2ce60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2ce70 56 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75 66  Vfs);.  if( nBuf
2ce80 3e 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74 45  >0 ) winGetLastE
2ce90 72 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66 2c  rrorMsg(e, nBuf,
2cea0 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   zBuf);.  return
2ceb0 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   e;.}../*.** Ini
2cec0 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e  tialize and dein
2ced0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
2cee0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
2cef0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
2cf00 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
2cf10 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
2cf20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56  sqlite3_vfs winV
2cf30 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf50 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2cf60 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
2cf70 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
2cf80 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2cf90 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
2cfa0 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2cfb0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfd0 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2cfe0 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20    "win32",      
2cff0 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
2d000 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2d010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2d020 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
2d030 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
2d040 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2d050 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2d060 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2d070 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2d080 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2d090 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2d0a0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2d0b0 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2d0c0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2d0d0 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2d0e0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2d0f0 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2d100 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2d110 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2d120 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2d130 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2d140 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2d150 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2d160 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
2d170 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
2d180 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2d190 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2d1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2d1b0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2d1c0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2d1d0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2d1e0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2d1f0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
2d200 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2d210 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2d220 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
2d230 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2d240 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2d250 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2d260 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2d270 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2d280 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
2d290 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2d2a0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2d2b0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
2d2c0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2d2d0 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  };.#if defined(S
2d2e0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2d2f0 57 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73  WIDE).  static s
2d300 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f  qlite3_vfs winLo
2d310 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20  ngPathVfs = {.  
2d320 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2d330 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2d340 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2d350 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
2d360 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2d370 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d    SQLITE_WINNT_M
2d380 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2d390 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2d3a0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2d3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2d3c0 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d  t */.    "win32-
2d3d0 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 2f 2a  longpath",    /*
2d3e0 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d400 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
2d410 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
2d420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2d430 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2d440 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2d450 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
2d460 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
2d470 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2d480 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2d490 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2d4a0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2d4b0 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2d4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2d4d0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2d4e0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2d4f0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2d500 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2d510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2d520 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2d530 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2d540 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
2d550 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
2d560 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
2d570 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
2d580 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
2d590 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
2d5a0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2d5b0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
2d5c0 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2d5d0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2d5e0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2d5f0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2d600 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2d610 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
2d620 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2d630 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2d640 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2d650 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2d660 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2d670 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2d680 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2d690 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
2d6a0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
2d6b0 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66  l */.  };.#endif
2d6c0 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68  ..  /* Double-ch
2d6d0 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79  eck that the aSy
2d6e0 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61  scall[] array ha
2d6f0 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  s been construct
2d700 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c  ed.  ** correctl
2d710 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b  y.  See ticket [
2d720 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61  bb3a86e890c8e96a
2d730 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  b] */.  assert( 
2d740 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
2d750 6c 6c 29 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a  ll)==80 );..  /*
2d760 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20   get memory map 
2d770 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75  allocation granu
2d780 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73  larity */.  mems
2d790 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20  et(&winSysInfo, 
2d7a0 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  0, sizeof(SYSTEM
2d7b0 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c  _INFO));.#if SQL
2d7c0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f  ITE_OS_WINRT.  o
2d7d0 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
2d7e0 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
2d7f0 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74  );.#else.  osGet
2d800 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
2d810 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  ysInfo);.#endif.
2d820 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
2d830 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
2d840 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29  nGranularity>0 )
2d850 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
2d860 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
2d870 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  e>0 );..  sqlite
2d880 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
2d890 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66  winVfs, 1);..#if
2d8a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2d8b0 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2d8c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
2d8d0 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50  gister(&winLongP
2d8e0 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64  athVfs, 0);.#end
2d8f0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
2d900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
2d910 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f  qlite3_os_end(vo
2d920 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  id){.#if SQLITE_
2d930 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
2d940 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b  leepObj!=NULL ){
2d950 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
2d960 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20  le(sleepObj);.  
2d970 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c    sleepObj = NUL
2d980 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  L;.  }.#endif.  
2d990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d9a0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
2d9b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.