/ Hex Artifact Content
Login

Artifact 5c780f4cf21eb5d28eab98b492afc6f27c6edc09:


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 46 69 6c 65 6e 61 6d 65   char *zFilename
cf60: 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
cf70: 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
cf80: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
cf90: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
cfa0: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
cfb0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
cfc0: 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  -1, NULL, 0);.  
cfd0: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
cfe0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cff0: 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  }.  zWideFilenam
d000: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
d010: 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a  cZero( nChar*siz
d020: 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  eof(zWideFilenam
d030: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
d040: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  WideFilename==0 
d050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d060: 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f  .  }.  nChar = o
d070: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
d080: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
d090: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
d0a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20  zWideFilename,. 
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d0d0: 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
d0e0: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
d0f0: 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46  ite3_free(zWideF
d100: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57  ilename);.    zW
d110: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ideFilename = 0;
d120: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
d130: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ideFilename;.}..
d140: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
d150: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
d160: 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
d170: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
d180: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a  urned string is.
d190: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
d1a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
d1b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
d1c0: 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55  r *winUnicodeToU
d1d0: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
d1e0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
d1f0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
d200: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  *zFilename;..  n
d210: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
d220: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
d230: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
d240: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
d250: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
d260: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
d270: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d280: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
d290: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
d2a0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
d2b0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
d2c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d2d0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
d2e0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
d2f0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
d300: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
d310: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65  zFilename, nByte
d320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e    0, 0);.  if( n
d350: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
d360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
d370: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
d380: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
d390: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d3a0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
d3b0: 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74  nvert an ANSI st
d3c0: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
d3d0: 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64  t Unicode, based
d3e0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
d3f0: 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74  nt codepage sett
d400: 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70  ings for file ap
d410: 69 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  is..**.** Space 
d420: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
d430: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d440: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
d450: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a  sqlite3_malloc..
d460: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
d470: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
d480: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
d490: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
d4a0: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
d4b0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20  zMbcsFilename;. 
d4c0: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
d4d0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
d4e0: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
d4f0: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
d500: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
d510: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
d520: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
d530: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  , -1, NULL,.    
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73              0)*s
d560: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
d570: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
d580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d590: 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  }.  zMbcsFilenam
d5a0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
d5b0: 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
d5c0: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
d5d0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
d5e0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
d5f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d600: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
d610: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
d620: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
d630: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
d640: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
d680: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
d690: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
d6a0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
d6b0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
d6c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
d6d0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
d6e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
d6f0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
d700: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
d710: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
d720: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
d730: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
d740: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
d750: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d760: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d770: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
d780: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
d790: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
d7a0: 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54  har *winUnicodeT
d7b0: 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57  oMbcs(LPCWSTR zW
d7c0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
d7d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
d7e0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
d7f0: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
d800: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
d810: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
d820: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
d830: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
d840: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
d850: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
d860: 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ame, -1, 0, 0, 0
d870: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
d880: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65  e == 0 ){.    re
d890: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
d8a0: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
d8b0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
d8c0: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
d8d0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
d8e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d8f0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
d900: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
d910: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
d920: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
d930: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
d960: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
d970: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
d980: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
d990: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
d9a0: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
d9b0: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
d9c0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
d9d0: 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68  ert multibyte ch
d9e0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
d9f0: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
da00: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72  to hold the.** r
da10: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
da20: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
da30: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
da40: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
da50: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
da60: 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72  _utf8(const char
da70: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
da80: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55  char *zFilenameU
da90: 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  tf8;.  LPWSTR zT
daa0: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
dab0: 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  ide = winMbcsToU
dac0: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
dad0: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
dae0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
daf0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
db00: 65 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e 55  enameUtf8 = winU
db10: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d  nicodeToUtf8(zTm
db20: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
db30: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
db40: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
db50: 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a  nameUtf8;.}../*.
db60: 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38  ** Convert UTF-8
db70: 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68   to multibyte ch
db80: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20  aracter string. 
db90: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
dba0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
dbb0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
dbc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
dbd0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
dbe0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
dbf0: 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e  utf8_to_mbcs(con
dc00: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
dc10: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
dc20: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50  lenameMbcs;.  LP
dc30: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
dc40: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
dc50: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
dc60: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
dc70: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
dc80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dc90: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  .  zFilenameMbcs
dca0: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d   = winUnicodeToM
dcb0: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
dcc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
dcd0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
dce0: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
dcf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
dd00: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
dd10: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
dd20: 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
dd30: 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64   directory based
dd40: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69   on.** the provi
dd50: 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ded arguments.  
dd60: 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e  The type argumen
dd70: 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f  t must be 1 in o
dd80: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a  rder to set the.
dd90: 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  ** data director
dda0: 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20  y or 2 in order 
ddb0: 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f  to set the tempo
ddc0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
ddd0: 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61   The zValue.** a
dde0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
ddf0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
de00: 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68  tory to use.  Th
de10: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  e return value w
de20: 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45  ill be.** SQLITE
de30: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
de40: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
de50: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
de60: 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65  ctory(DWORD type
de70: 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65  , LPCWSTR zValue
de80: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69  ){.  char **ppDi
de90: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66  rectory = 0;.#if
dea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
deb0: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20  _AUTOINIT.  int 
dec0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
ded0: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
dee0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
def0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79  .#endif.  if( ty
df00: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
df10: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
df20: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
df30: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
df40: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
df50: 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  y;.  }else if( t
df60: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
df70: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
df80: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
df90: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
dfa0: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
dfb0: 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ry;.  }.  assert
dfc0: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
dfd0: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
dfe0: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
dff0: 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20  ORY_TYPE.       
e000: 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49     || type==SQLI
e010: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
e020: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29  RECTORY_TYPE.  )
e030: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  ;.  assert( !ppD
e040: 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69  irectory || sqli
e050: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
e060: 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c  pe(*ppDirectory,
e070: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
e080: 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74  ;.  if( ppDirect
e090: 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ory ){.    char 
e0a0: 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b  *zValueUtf8 = 0;
e0b0: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
e0c0: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
e0d0: 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38        zValueUtf8
e0e0: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
e0f0: 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20  tf8(zValue);.   
e100: 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74     if ( zValueUt
e110: 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f8==0 ){.       
e120: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e130: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
e140: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e150: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
e160: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
e170: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
e180: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
e190: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e1a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e1b0: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
e1c0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
e1d0: 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74  ue of winGetLast
e1e0: 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a  ErrorMsg.** is z
e1f0: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
e200: 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
e210: 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
e220: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
e230: 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
e240: 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
e250: 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ted)..*/.static 
e260: 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
e270: 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73  rorMsg(DWORD las
e280: 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66  tErrno, int nBuf
e290: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
e2a0: 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   /* FormatMessag
e2b0: 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66  e returns 0 on f
e2c0: 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69  ailure.  Otherwi
e2d0: 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72  se it.  ** retur
e2e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
e2f0: 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20   TCHARs written 
e300: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  to the output.  
e310: 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75  ** buffer, exclu
e320: 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61  ding the termina
e330: 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a  ting null char..
e340: 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c    */.  DWORD dwL
e350: 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  en = 0;.  char *
e360: 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  zOut = 0;..  if(
e370: 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
e380: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
e390: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
e3a0: 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33  Wide[SQLITE_WIN3
e3b0: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
e3c0: 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e  RS+1];.    dwLen
e3d0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
e3e0: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
e3f0: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
e400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
e420: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
e430: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a            NULL,.
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
e480: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a       zTempWide,.
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e4f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
e500: 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20  RMSG_CHARS,.    
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c           0);.#el
e530: 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  se.    LPWSTR zT
e540: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
e550: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
e560: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
e570: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
e580: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
e5b0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
e5c0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
e5f0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
e600: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
e690: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
e6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
e6e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
e6f0: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
e700: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
e710: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
e720: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
e730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
e740: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
e750: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77  ;.      zOut = w
e760: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
e770: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
e780: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
e790: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20  gnMalloc();.#if 
e7a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
e7b0: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
e7c0: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
e7d0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
e7e0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
e7f0: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
e800: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e  (zTempWide);.#en
e810: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  dif.    }.  }.#i
e820: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
e830: 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
e840: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
e850: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
e860: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
e870: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
e880: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
e890: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
e8c0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
e8d0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
e900: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
e930: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
e950: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e970: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26         (LPSTR) &
e9a0: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
e9f0: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
ea00: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
ea10: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
ea20: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
ea30: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
ea40: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
ea50: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  .      zOut = sq
ea60: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
ea70: 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
ea80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
ea90: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
eaa0: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
eab0: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
eac0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
ead0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
eae0: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
eaf0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  (zTemp);.    }. 
eb00: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
eb10: 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20  0 == dwLen ){.  
eb20: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
eb30: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
eb40: 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25  OsError 0x%lx (%
eb50: 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  lu)", lastErrno,
eb60: 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d   lastErrno);.  }
eb70: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70  else{.    /* cop
eb80: 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e  y a maximum of n
eb90: 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74  Buf chars to out
eba0: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
ebb0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ebc0: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
ebd0: 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
ebe0: 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38  /* free the UTF8
ebf0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
ec00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
ec10: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ec20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  0;.}../*.**.** T
ec30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77  his function - w
ec40: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
ec50: 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65  () - is only eve
ec60: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
ec70: 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67   macro.** winLog
ec80: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Error()..**.** T
ec90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
eca0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
ecb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
ecc0: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a  an OS function..
ecd0: 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  ** It logs a mes
ece0: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
ecf0: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
ed00: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
ed10: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f  value of.** erro
ed20: 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70  r code and, if p
ed30: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
ed40: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
ed50: 76 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46  valent from.** F
ed60: 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a  ormatMessage..**
ed70: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
ed80: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
ed90: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
eda0: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
edb0: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
edc0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
edd0: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
ede0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
edf0: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
ee00: 4e 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  N)..** The two s
ee10: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
ee20: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
ee30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
ee40: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
ee50: 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65  * failed and the
ee60: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
ee70: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66  -system path, if
ee80: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
ee90: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62   winLogError(a,b
eea0: 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72  ,c,d)   winLogEr
eeb0: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
eec0: 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  d,__LINE__).stat
eed0: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72  ic int winLogErr
eee0: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
eef0: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ef10: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
ef20: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
ef30: 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  Errno,          
ef40: 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c        /* Win32 l
ef50: 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63  ast error */.  c
ef60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
ef70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ef80: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
ef90: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
efa0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
efb0: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
efc0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
efd0: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
efe0: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
eff0: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f010: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
f020: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
f030: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
f040: 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d    char zMsg[500]
f050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f060: 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61    /* Human reada
f070: 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a  ble error text *
f080: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
f0b0: 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30  ter */..  zMsg[0
f0c0: 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c  ] = 0;.  winGetL
f0d0: 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74  astErrorMsg(last
f0e0: 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d  Errno, sizeof(zM
f0f0: 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73  sg), zMsg);.  as
f100: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
f110: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
f120: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
f130: 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69  th = "";.  for(i
f140: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
f150: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20  Msg[i]!='\r' && 
f160: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69  zMsg[i]!='\n'; i
f170: 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20  ++){}.  zMsg[i] 
f180: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  = 0;.  sqlite3_l
f190: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
f1a0: 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20    "os_win.c:%d: 
f1b0: 28 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25  (%lu) %s(%s) - %
f1c0: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
f1d0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e   lastErrno, zFun
f1e0: 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20  c, zPath, zMsg. 
f1f0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
f200: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
f210: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  The number of ti
f220: 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46  mes that a ReadF
f230: 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65  ile(), WriteFile
f240: 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69  (), and DeleteFi
f250: 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  le().** will be 
f260: 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e  retried followin
f270: 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f  g a locking erro
f280: 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75  r - probably cau
f290: 73 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69  sed by.** antivi
f2a0: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
f2b0: 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
f2c0: 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
f2d0: 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
f2e0: 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
f2f0: 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
f300: 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
f310: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f320: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
f330: 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
f340: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
f350: 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
f360: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
f370: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
f380: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
f390: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
f3a0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
f3b0: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
f3c0: 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79  nt winIoerrRetry
f3d0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
f3e0: 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61  IOERR_RETRY;.sta
f3f0: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
f400: 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c  RetryDelay = SQL
f410: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
f420: 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a  RETRY_DELAY;../*
f430: 0a 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72  .** The "winIoer
f440: 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72  rCanRetry1" macr
f450: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  o is used to det
f460: 65 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74  ermine if a part
f470: 69 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72  icular I/O.** er
f480: 72 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65  ror code obtaine
f490: 64 20 76 69 61 20 47 65 74 4c 61 73 74 45 72 72  d via GetLastErr
f4a0: 6f 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65  or() is eligible
f4b0: 20 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20   to be retried. 
f4c0: 20 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65   It.** must acce
f4d0: 70 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  pt the error cod
f4e0: 65 20 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f  e DWORD as its o
f4f0: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  nly argument and
f500: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a   should return.*
f510: 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
f520: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
f530: 74 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74  transient in nat
f540: 75 72 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72  ure and the oper
f550: 61 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73  ation.** respons
f560: 69 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74  ible for generat
f570: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
f580: 20 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63   error might suc
f590: 63 65 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a  ceed upon being.
f5a0: 2a 2a 20 72 65 74 72 69 65 64 2e 20 20 54 68 65  ** retried.  The
f5b0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
f5c0: 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  s macro should b
f5d0: 65 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a  e a variable..**
f5e0: 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  .** Additionally
f5f0: 2c 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20  , a macro named 
f600: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
f610: 79 32 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e  y2" may be defin
f620: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73  ed.  If it.** is
f630: 20 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c   defined, it wil
f640: 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f  l be consulted o
f650: 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63  nly when the mac
f660: 72 6f 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  ro "winIoerrCanR
f670: 65 74 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e  etry1".** return
f680: 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69  s zero.  The "wi
f690: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22  nIoerrCanRetry2"
f6a0: 20 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65   macro is comple
f6b0: 74 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e  tely optional an
f6c0: 64 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64  d.** may be used
f6d0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69   to include addi
f6e0: 74 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64  tional error cod
f6f0: 65 73 20 69 6e 20 74 68 65 20 73 65 74 20 74 68  es in the set th
f700: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73  at should.** res
f710: 75 6c 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69  ult in the faili
f720: 6e 67 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e  ng I/O operation
f730: 20 62 65 69 6e 67 20 72 65 74 72 69 65 64 20 62   being retried b
f740: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49  y the caller.  I
f750: 66 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68  f.** defined, th
f760: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
f770: 74 72 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74  try2" macro must
f780: 20 65 78 68 69 62 69 74 20 65 78 74 65 72 6e 61   exhibit externa
f790: 6c 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69  l semantics.** i
f7a0: 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73  dentical to thos
f7b0: 65 20 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65  e of the "winIoe
f7c0: 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63  rrCanRetry1" mac
f7d0: 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ro..*/.#if !defi
f7e0: 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52  ned(winIoerrCanR
f7f0: 65 74 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77  etry1).#define w
f800: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f810: 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52  (a) (((a)==ERROR
f820: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20  _ACCESS_DENIED) 
f830: 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20         || \.    
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
f860: 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49  ERROR_SHARING_VI
f870: 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c  OLATION)    || \
f880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f8a0: 28 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f  (a)==ERROR_LOCK_
f8b0: 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20  VIOLATION)      
f8c0: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f8f0: 44 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20  DEV_NOT_EXIST)  
f900: 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f930: 52 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c  RROR_NETNAME_DEL
f940: 45 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a  ETED)      || \.
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f970: 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49  a)==ERROR_SEM_TI
f980: 4d 45 4f 55 54 29 20 20 20 20 20 20 20 20 20 20  MEOUT)          
f990: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
f9c0: 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42  ETWORK_UNREACHAB
f9d0: 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LE)).#endif../*.
f9e0: 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65  ** If a ReadFile
f9f0: 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28  () or WriteFile(
fa00: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
fa10: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
fa20: 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ine.** to see if
fa30: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
fa40: 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54  tried.  Return T
fa50: 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52  RUE to retry.  R
fa60: 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74  eturn FALSE.** t
fa70: 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61  o give up with a
fa80: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
fa90: 69 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49  ic int winRetryI
faa0: 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72  oerr(int *pnRetr
fab0: 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72  y, DWORD *pError
fac0: 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f  ){.  DWORD e = o
fad0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
fae0: 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e  .  if( *pnRetry>
faf0: 3d 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29  =winIoerrRetry )
fb00: 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72  {.    if( pError
fb10: 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
fb20: 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20  r = e;.    }.   
fb30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
fb40: 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e   if( winIoerrCan
fb50: 52 65 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20  Retry1(e) ){.   
fb60: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
fb70: 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74  leep(winIoerrRet
fb80: 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65  ryDelay*(1+*pnRe
fb90: 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e  try));.    ++*pn
fba0: 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72  Retry;.    retur
fbb0: 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66  n 1;.  }.#if def
fbc0: 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e  ined(winIoerrCan
fbd0: 52 65 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69  Retry2).  else i
fbe0: 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  f( winIoerrCanRe
fbf0: 74 72 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73  try2(e) ){.    s
fc00: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
fc10: 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
fc20: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
fc30: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
fc40: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
fc50: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
fc60: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
fc70: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
fc80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
fc90: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f  ../*.** Log a I/
fca0: 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70  O error retry ep
fcb0: 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  isode..*/.static
fcc0: 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72   void winLogIoer
fcd0: 72 28 69 6e 74 20 6e 52 65 74 72 79 2c 20 69 6e  r(int nRetry, in
fce0: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
fcf0: 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73   nRetry ){.    s
fd00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
fd10: 45 5f 4e 4f 54 49 43 45 2c 0a 20 20 20 20 20 20  E_NOTICE,.      
fd20: 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f  "delayed %dms fo
fd30: 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63  r lock/sharing c
fd40: 6f 6e 66 6c 69 63 74 20 61 74 20 6c 69 6e 65 20  onflict at line 
fd50: 25 64 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f  %d",.      winIo
fd60: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
fd70: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
fd80: 32 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20 20 29 3b  2, lineno.    );
fd90: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  .  }.}..#if SQLI
fda0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a  TE_OS_WINCE./***
fdb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdf0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  ******.** This s
fe00: 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ection contains 
fe10: 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f  code for WinCE o
fe20: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  nly..*/.#if !def
fe30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43  ined(SQLITE_MSVC
fe40: 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20  _LOCALTIME_API) 
fe50: 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f  || !SQLITE_MSVC_
fe60: 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a  LOCALTIME_API./*
fe70: 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54  .** The MSVC CRT
fe80: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d   on Windows CE m
fe90: 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  ay not have a lo
fea0: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
feb0: 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74  on.  So.** creat
fec0: 65 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a  e a substitute..
fed0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
fee0: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
fef0: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
ff00: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
ff10: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
ff20: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
ff30: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
ff40: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
ff50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
ff60: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
ff70: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
ff80: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
ff90: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
ffa0: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
ffb0: 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
ffc0: 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
ffd0: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
ffe0: 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
fff0: 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  2);.  osFileTime
10000 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28  ToLocalFileTime(
10010 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73  &uTm,&lTm);.  os
10020 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
10030 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b  Time(&lTm,&pTm);
10040 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70  .  y.tm_year = p
10050 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b  Tm.wYear - 1900;
10060 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54  .  y.tm_mon = pT
10070 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20  m.wMonth - 1;.  
10080 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e  y.tm_wday = pTm.
10090 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e  wDayOfWeek;.  y.
100a0 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_mday = pTm.wD
100b0 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20  ay;.  y.tm_hour 
100c0 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79  = pTm.wHour;.  y
100d0 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_min = pTm.wM
100e0 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65  inute;.  y.tm_se
100f0 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b  c = pTm.wSecond;
10100 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a  .  return &y;.}.
10110 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
10120 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
10130 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26  E(a) (winFile*)&
10140 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74  ((char*)a)[-(int
10150 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c  )offsetof(winFil
10160 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  e,h)]../*.** Acq
10170 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  uire a lock on t
10180 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73  he handle h.*/.s
10190 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
101a0 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e  MutexAcquire(HAN
101b0 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44  DLE h){.   DWORD
101c0 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a   dwErr;.   do {.
101d0 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57       dwErr = osW
101e0 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
101f0 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b  ct(h, INFINITE);
10200 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45  .   } while (dwE
10210 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43  rr != WAIT_OBJEC
10220 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20  T_0 && dwErr != 
10230 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b  WAIT_ABANDONED);
10240 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  .}./*.** Release
10250 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64   a lock acquired
10260 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63   by winceMutexAc
10270 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69  quire().*/.#defi
10280 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  ne winceMutexRel
10290 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d  ease(h) ReleaseM
102a0 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43  utex(h)../*.** C
102b0 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20  reate the mutex 
102c0 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  and shared memor
102d0 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  y used for locki
102e0 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ng in the file.*
102f0 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  * descriptor pFi
10300 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
10310 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
10320 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
10330 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20  lename, winFile 
10340 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54  *pFile){.  LPWST
10350 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52  R zTok;.  LPWSTR
10360 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20   zName;.  DWORD 
10370 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f  lastErrno;.  BOO
10380 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53  L bLogged = FALS
10390 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20  E;.  BOOL bInit 
103a0 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65  = TRUE;..  zName
103b0 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
103c0 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
103d0 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
103e0 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20  {.    /* out of 
103f0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65  memory */.    re
10400 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10410 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
10420 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
10430 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ze the local loc
10440 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65  kdata */.  memse
10450 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  t(&pFile->local,
10460 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65   0, sizeof(pFile
10470 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
10480 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
10490 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
104a0 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
104b0 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
104c0 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
104d0 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
104e0 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72  ok = osCharLower
104f0 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
10500 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
10510 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
10520 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
10530 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
10540 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
10550 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
10560 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
10570 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  osCreateMutexW(N
10580 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
10590 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
105a0 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
105b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
105c0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
105d0 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
105e0 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
105f0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
10600 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
10610 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
10620 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
10630 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
10640 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
10650 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  Filename);.  }..
10660 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
10670 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
10680 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
10690 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
106a0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
106b0 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
106c0 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
106d0 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
106e0 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
106f0 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20 63  s etc are.  ** c
10700 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
10710 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
10720 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
10730 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
10740 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
10750 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
10760 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
10770 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
10780 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
10790 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
107a0 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
107b0 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
107c0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
107d0 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
10810 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
10820 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
10850 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ame);..  /* Set 
10860 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
10870 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
10880 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
10890 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
108a0 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
108b0 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
108c0 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  /.  lastErrno = 
108d0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
108e0 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e  ;.  if (lastErrn
108f0 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  o == ERROR_ALREA
10900 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
10910 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
10920 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
10930 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  ee(zName);..  /*
10940 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64   If we succeeded
10950 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73   in making the s
10960 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
10970 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a  dle, map it. */.
10980 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
10990 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c  ared ){.    pFil
109a0 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e  e->shared = (win
109b0 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65  ceLock*)osMapVie
109c0 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  wOfFile(pFile->h
109d0 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
109e0 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45       FILE_MAP_RE
109f0 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  AD|FILE_MAP_WRIT
10a00 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  E, 0, 0, sizeof(
10a10 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20  winceLock));.   
10a20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66   /* If mapping f
10a30 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65  ailed, close the
10a40 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
10a50 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20  andle and erase 
10a60 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  it */.    if( !p
10a70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a  File->shared ){.
10a80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
10a90 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
10aa0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
10ab0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
10ac0 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
10ad0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10af0 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32  winceCreateLock2
10b00 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
10b10 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
10b20 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  RUE;.      osClo
10b30 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
10b40 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
10b50 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
10b60 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
10b70 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
10b80 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
10b90 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
10ba0 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
10bb0 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
10bc0 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61   if( pFile->hSha
10bd0 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  red==NULL ){.   
10be0 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b   if( !bLogged ){
10bf0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
10c00 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
10c10 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  rno;.      winLo
10c20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
10c30 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
10c40 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
10c50 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
10c60 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69  reateLock3", zFi
10c70 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
10c80 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
10c90 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75     }.    winceMu
10ca0 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
10cb0 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
10cc0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
10cd0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
10ce0 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
10cf0 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
10d00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
10d10 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
10d20 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
10d30 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
10d40 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
10d50 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20   if( bInit ){.  
10d60 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
10d70 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
10d80 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
10d90 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
10da0 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
10db0 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
10dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10dd0 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
10de0 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
10df0 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
10e00 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
10e10 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
10e20 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
10e30 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
10e40 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
10e50 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
10e60 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
10e70 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
10e80 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
10e90 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
10ea0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
10eb0 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
10ec0 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
10ed0 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
10ee0 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
10ef0 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
10f00 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
10f10 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
10f20 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
10f30 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
10f40 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10f50 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
10f60 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
10f70 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10f80 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
10f90 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
10fa0 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
10fb0 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
10fc0 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
10fd0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
10fe0 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
10ff0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
11000 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
11010 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
11020 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
11030 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
11040 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
11050 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
11060 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
11070 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
11080 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
11090 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d  dle */.    osUnm
110a0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
110b0 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
110c0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
110d0 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
110e0 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
110f0 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
11100 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
11110 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11120 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
11130 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
11140 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
11150 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
11160 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  .  }.}../*.** An
11170 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11180 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
11190 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
111a0 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
111b0 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
111c0 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
111d0 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
111e0 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
111f0 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
11200 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
11210 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
11220 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
11230 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
11240 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
11250 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11260 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
11270 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
11280 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
11290 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
112a0 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
112b0 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
112c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
112d0 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
112e0 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  oLockHigh);..  i
112f0 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
11300 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
11310 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
11320 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
11330 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e  x);..  /* Wantin
11340 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
11350 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77  ock? */.  if (dw
11360 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
11370 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
11380 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
11390 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
113a0 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
113b0 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
113c0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
113d0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
113e0 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
113f0 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
11400 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
11410 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
11420 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
11430 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
11440 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
11450 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
11460 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11470 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
11480 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
11490 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
114a0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
114b0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
114c0 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
114d0 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72           nNumber
114e0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
114f0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
11500 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11510 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
11520 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
11530 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  cal.nReaders ++;
11540 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
11550 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
11560 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20   == 1){.        
11570 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
11580 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
11590 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
115a0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
115b0 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
115c0 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a   pending lock? *
115d0 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
115e0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
115f0 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
11600 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
11610 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
11620 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
11630 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
11640 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
11650 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
11660 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
11670 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11680 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11690 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
116a0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
116b0 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
116c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
116d0 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
116e0 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
116f0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
11700 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
11710 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
11720 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11730 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11740 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
11750 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
11760 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
11770 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
11780 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
11790 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
117a0 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
117b0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
117c0 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
117d0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
117e0 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
117f0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
11800 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
11810 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
11820 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
11830 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
11840 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
11850 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
11860 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11870 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
11880 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
11890 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
118a0 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
118b0 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
118c0 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
118d0 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
118e0 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
118f0 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
11900 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11910 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
11920 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
11930 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
11940 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
11950 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
11960 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
11970 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
11980 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
11990 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
119a0 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
119b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
119c0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
119d0 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
119e0 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
119f0 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
11a00 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
11a10 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
11a20 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
11a30 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
11a40 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
11a50 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
11a60 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
11a70 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11a80 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
11a90 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
11aa0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
11ab0 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
11ac0 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
11ad0 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
11ae0 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
11af0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
11b00 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
11b10 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
11b20 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
11b30 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
11b40 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
11b50 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
11b60 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
11b70 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
11b80 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
11b90 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
11ba0 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
11bb0 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
11bc0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
11bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
11be0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
11bf0 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
11c00 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20  )SHARED_SIZE.   
11c10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75            || nNu
11c20 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
11c30 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20  ockLow == 1);.  
11c40 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
11c50 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  .nReaders --;.  
11c60 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11c70 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
11c80 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   0).      {.    
11c90 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
11ca0 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
11cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
11cc0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
11cd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
11ce0 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e  leasing a pendin
11cf0 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  g lock */.  else
11d00 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
11d10 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
11d20 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20  ENDING_BYTE.    
11d30 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
11d40 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
11d50 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
11d60 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11d70 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
11d80 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
11d90 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
11da0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11db0 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
11dc0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
11dd0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
11de0 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65   }.  }.  /* Rele
11df0 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64  asing a reserved
11e00 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
11e10 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
11e20 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
11e30 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20  SERVED_BYTE.    
11e40 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
11e50 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
11e60 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
11e70 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11e80 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20  bReserved) {.   
11e90 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
11ea0 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
11eb0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
11ec0 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
11ed0 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
11ee0 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
11ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
11f00 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
11f10 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11f20 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
11f30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
11f40 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
11f50 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e for wince.****
11f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
11fb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
11fc0 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  INCE */../*.** L
11fd0 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
11fe0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  n..*/.static BOO
11ff0 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20  L winLockFile(. 
12000 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
12010 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c  ,.  DWORD flags,
12020 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
12030 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
12040 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
12050 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
12060 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
12070 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
12080 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
12090 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
120a0 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
120b0 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
120c0 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
120d0 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
120e0 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c       API LockFil
120f0 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
12100 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70   winceLockFile(p
12110 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
12120 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  , offsetHigh,.  
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
12150 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
12160 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
12170 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
12180 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
12190 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
121a0 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
121b0 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
121c0 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
121d0 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
121e0 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
121f0 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
12200 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a  n osLockFileEx(*
12210 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30  phFile, flags, 0
12220 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e  , numBytesLow, n
12230 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76  umBytesHigh, &ov
12240 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
12250 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
12260 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66  ile(*phFile, off
12270 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
12280 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
12290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
122a0 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48         numBytesH
122b0 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  igh);.  }.#endif
122c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
122d0 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
122e0 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20   */.static BOOL 
122f0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  winUnlockFile(. 
12300 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
12310 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
12320 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
12330 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
12340 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
12350 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
12360 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
12370 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
12380 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
12390 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
123a0 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
123b0 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
123c0 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
123d0 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b        API Unlock
123e0 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
123f0 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  urn winceUnlockF
12400 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
12410 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
12420 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
12430 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
12440 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
12450 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
12460 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
12470 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
12480 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
12490 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
124a0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
124b0 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
124c0 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
124d0 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
124e0 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
124f0 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63    return osUnloc
12500 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
12510 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
12520 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
12530 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
12540 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c      return osUnl
12550 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
12560 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
12570 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
12580 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
125a0 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
125b0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  #endif.}../*****
125c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12600 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
12610 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f  next group of ro
12620 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
12630 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
12640 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
12650 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
12660 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a  methods object..
12670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
126c0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72  ./*.** Some Micr
126d0 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20  osoft compilers 
126e0 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69  lack this defini
126f0 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
12700 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
12710 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69  E_POINTER.# defi
12720 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ne INVALID_SET_F
12730 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57  ILE_POINTER ((DW
12740 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
12750 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
12760 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
12770 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
12780 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
12790 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
127a0 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
127b0 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
127c0 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
127d0 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ful, return 0..*
127e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
127f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12800 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
12810 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
12820 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65   int winSeekFile
12830 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
12840 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
12850 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51  Offset){.#if !SQ
12860 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
12870 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
128a0 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
128b0 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
128c0 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
128d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
128e0 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
128f0 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
12900 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
12930 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
12940 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52  nter() */.  DWOR
12950 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
12960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
12970 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
12980 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
12990 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  */..  OSTRACE(("
129a0 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66  SEEK file=%p, of
129b0 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46  fset=%lld\n", pF
129c0 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29  ile->h, iOffset)
129d0 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20  );..  upperBits 
129e0 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65  = (LONG)((iOffse
129f0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
12a00 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  fff);.  lowerBit
12a10 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73  s = (LONG)(iOffs
12a20 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
12a30 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69  ;..  /* API oddi
12a40 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75  ty: If successfu
12a50 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  l, SetFilePointe
12a60 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77  r() returns a dw
12a70 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ord.  ** contain
12a80 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
12a90 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
12aa0 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
12ab0 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
12ac0 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
12ad0 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
12ae0 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
12af0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
12b00 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44  DN,.  ** INVALID
12b10 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
12b20 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20  R may also be a 
12b30 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74  valid new offset
12b40 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e  . So to determin
12b50 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61  e.  ** whether a
12b60 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75  n error has actu
12b70 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69  ally occurred, i
12b80 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73  t is also necess
12b90 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  ary to call.  **
12ba0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e   GetLastError().
12bb0 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20  .  */.  dwRet = 
12bc0 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
12bd0 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72  (pFile->h, lower
12be0 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
12bf0 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
12c00 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e    if( (dwRet==IN
12c10 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
12c20 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20  OINTER.      && 
12c30 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
12c40 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
12c50 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20  =NO_ERROR)) ){. 
12c60 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12c70 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
12c80 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
12c90 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
12ca0 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
12cb0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12cc0 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
12cd0 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
12ce0 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
12cf0 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
12d00 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
12d10 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
12d20 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
12d30 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
12d40 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12d50 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12d60 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12d70 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65   return 0;.#else
12d80 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20  .  /*.  ** Same 
12d90 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  as above, except
12da0 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65   that this imple
12db0 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20  mentation works 
12dc0 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a  for WinRT..  */.
12dd0 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  .  LARGE_INTEGER
12de0 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
12df0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66     /* The new of
12e00 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  fset */.  BOOL b
12e10 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
12e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
12e30 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
12e40 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
12e50 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61  ) */..  x.QuadPa
12e60 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20  rt = iOffset;.  
12e70 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65  bRet = osSetFile
12e80 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d  PointerEx(pFile-
12e90 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42  >h, x, 0, FILE_B
12ea0 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52  EGIN);..  if(!bR
12eb0 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  et){.    pFile->
12ec0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
12ed0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
12ee0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
12ef0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
12f00 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12f10 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
12f20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22     "winSeekFile"
12f30 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
12f40 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
12f50 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
12f60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
12f70 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
12f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
12f90 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
12fa0 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
12fb0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
12fc0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
12fd0 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
12fe0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12ff0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20  _MMAP_SIZE>0./* 
13000 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
13010 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
13020 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
13030 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  r memory mapped 
13040 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  files */.static 
13050 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77  int winMapfile(w
13060 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  inFile*, sqlite3
13070 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63 20  _int64);.static 
13080 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
13090 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64  (winFile*);.#end
130a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  if../*.** Close 
130b0 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
130c0 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
130d0 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
130e0 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
130f0 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
13100 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
13110 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
13120 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
13130 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
13140 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
13150 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
13160 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
13170 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
13180 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
13190 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
131a0 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
131b0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
131c0 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
131d0 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
131e0 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
131f0 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
13200 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
13210 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
13220 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
13230 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
13240 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
13250 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
13260 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
13270 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13280 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
13290 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
132a0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
132b0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
132c0 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
132d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
132e0 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
132f0 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
13300 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
13310 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20   pFile->h!=NULL 
13320 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56  && pFile->h!=INV
13330 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
13340 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  E );.  OSTRACE((
13350 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  "CLOSE pid=%lu, 
13360 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
13370 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
13380 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
13390 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
133a0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69   pFile->h));..#i
133b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
133c0 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e  P_SIZE>0.  winUn
133d0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
133e0 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20  #endif..  do{.  
133f0 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61    rc = osCloseHa
13400 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  ndle(pFile->h);.
13410 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49      /* SimulateI
13420 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e  OError( rc=0; cn
13430 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  t=MX_CLOSE_ATTEM
13440 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69  PT; ); */.  }whi
13450 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63  le( rc==0 && ++c
13460 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  nt < MX_CLOSE_AT
13470 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65  TEMPT && (sqlite
13480 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
13490 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51  0), 1) );.#if SQ
134a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64  LITE_OS_WINCE.#d
134b0 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45  efine WINCE_DELE
134c0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a  TION_ATTEMPTS 3.
134d0 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f    winceDestroyLo
134e0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ck(pFile);.  if(
134f0 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
13500 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e  nClose ){.    in
13510 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77  t cnt = 0;.    w
13520 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  hile(.          
13530 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70   osDeleteFileW(p
13540 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
13550 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20  lose)==0.       
13560 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74   && osGetFileAtt
13570 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e  ributesW(pFile->
13580 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21  zDeleteOnClose)!
13590 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 20  =0xffffffff.    
135a0 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
135b0 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
135c0 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
135d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
135e0 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20  32_sleep(100);  
135f0 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
13600 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
13610 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
13620 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13630 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
13640 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lose);.  }.#endi
13650 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  f.  if( rc ){.  
13660 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
13670 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
13680 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52  nter(-1);.  OSTR
13690 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
136a0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
136b0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
136c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
136d0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
136e0 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
136f0 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
13700 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
13710 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
13720 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
13730 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
13740 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
13750 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
13760 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
13790 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
137a0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
137b0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
137c0 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
137d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
137e0 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
137f0 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
13800 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
13810 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
13820 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
13830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13840 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
13850 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
13860 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
13870 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
13880 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
13890 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
138a0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
138b0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
138c0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
138d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
138e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
138f0 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
13900 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
13910 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
13920 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
13930 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
13940 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
13950 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13960 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
13970 4c 41 50 50 45 44 29 0a 20 20 4f 56 45 52 4c 41  LAPPED).  OVERLA
13980 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
13990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
139a0 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64   offset for Read
139b0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
139c0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
139d0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
139e0 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65    /* file handle
139f0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61   */.  DWORD nRea
13a00 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
13a10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13a20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
13a30 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65  y read from file
13a40 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
13a50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13a60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13a70 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20  of retrys */..  
13a80 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
13a90 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
13aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
13ab0 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d  fset>=0 );.  Sim
13ac0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
13ad0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13ae0 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43  _READ);.  OSTRAC
13af0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
13b00 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
13b10 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20  =%p, buffer=%p, 
13b20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20  amount=%d, ".   
13b30 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d          "offset=
13b40 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
13b50 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
13b60 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
13b70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13b80 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
13b90 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
13ba0 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
13bb0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
13bc0 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
13bd0 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
13be0 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71  of this read req
13bf0 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
13c00 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
13c10 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
13c20 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
13c30 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
13c40 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
13c50 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
13c60 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
13c70 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
13c80 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
13c90 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
13ca0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
13cb0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
13cc0 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20  ffset], amt);.  
13cd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
13ce0 41 44 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  AD-MMAP pid=%lu,
13cf0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
13d00 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
13d10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
13d20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
13d30 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
13d40 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
13d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13d60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13d70 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
13d80 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
13d90 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
13da0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
13db0 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
13dc0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
13dd0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
13de0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
13df0 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
13e00 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
13e10 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
13e20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
13e30 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
13e40 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
13e50 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65  E_OS_WINCE || de
13e60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
13e70 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
13e80 29 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  ).  if( winSeekF
13e90 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
13ea0 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  t) ){.    OSTRAC
13eb0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
13ec0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
13ed0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46  =%p, rc=SQLITE_F
13ee0 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ULL\n",.        
13ef0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
13f00 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
13f10 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
13f20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13f30 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
13f40 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
13f50 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
13f60 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
13f70 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
13f80 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
13f90 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
13fa0 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
13fb0 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
13fc0 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
13fd0 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
13fe0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
13ff0 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
14000 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
14010 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
14020 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
14030 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
14040 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
14050 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
14060 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
14070 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
14080 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
14090 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
140a0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69  rrno;.    if( wi
140b0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
140c0 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
140d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
140e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
140f0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
14100 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
14110 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14120 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14130 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  =SQLITE_IOERR_RE
14140 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AD\n",.         
14150 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14160 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14170 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
14180 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
14190 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
141a0 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d  ERR_READ, pFile-
141b0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141d0 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
141e0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
141f0 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e  .  winLogIoerr(n
14200 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  Retry, __LINE__)
14210 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
14220 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
14230 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
14240 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
14250 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
14260 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
14270 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
14280 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
14290 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ead);.    OSTRAC
142a0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
142b0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
142c0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
142d0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c  OERR_SHORT_READ\
142e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
142f0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14300 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14310 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14330 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
14340 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
14350 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20  ("READ pid=%lu, 
14360 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
14370 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
14380 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
14390 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
143a0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
143b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
143c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
143d0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
143e0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
143f0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
14400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
14410 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
14420 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
14430 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
14440 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14450 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c   winWrite(.  sql
14460 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14480 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e  File to write in
14490 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  to */.  const vo
144a0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
144b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
144c0 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74  ytes to be writt
144d0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  en */.  int amt,
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14500 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
14510 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
14520 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
14530 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
14540 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
14550 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
14560 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g at */.){.  int
14570 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14590 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61  True if error ha
145a0 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65  s occurred, else
145b0 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
145c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
145d0 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
145e0 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
145f0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
14620 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
14630 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
14640 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14650 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14660 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
14670 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
14680 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
14690 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
146a0 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
146b0 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
146c0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
146d0 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d  file=%p, buffer=
146e0 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22  %p, amount=%d, "
146f0 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f 66 66  .           "off
14700 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  set=%lld, lock=%
14710 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  d\n", osGetCurre
14720 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14730 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
14740 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c   pFile->h, pBuf,
14750 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46   amt, offset, pF
14760 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
14770 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
14780 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
14790 49 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d  ITE) && SQLITE_M
147a0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
147b0 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
147c0 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
147d0 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
147e0 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
147f0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
14800 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
14810 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
14820 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
14830 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
14840 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
14850 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
14860 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
14870 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
14880 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
14890 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
148a0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
148b0 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
148c0 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50 20  CE(("WRITE-MMAP 
148d0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
148e0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
148f0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
14900 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
14910 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14920 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14930 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
14940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14960 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
14970 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
14980 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
14990 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
149a0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
149b0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
149c0 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20   pBuf, nCopy);. 
149d0 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
149e0 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
149f0 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
14a00 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
14a10 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
14a20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
14a30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
14a40 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  CE || defined(SQ
14a50 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
14a60 45 52 4c 41 50 50 45 44 29 0a 20 20 72 63 20 3d  ERLAPPED).  rc =
14a70 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
14a80 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
14a90 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73  f( rc==0 ){.#els
14aa0 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66  e.  {.#endif.#if
14ab0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
14ac0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
14ad0 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
14ae0 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 4f 56  ERLAPPED).    OV
14af0 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
14b00 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ped;        /* T
14b10 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72  he offset for Wr
14b20 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  iteFile. */.#end
14b30 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20  if.    u8 *aRem 
14b40 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20  = (u8 *)pBuf;   
14b50 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74       /* Data yet
14b60 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
14b70 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  /.    int nRem =
14b80 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20   amt;           
14b90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14ba0 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65   bytes yet to be
14bb0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
14bc0 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20  DWORD nWrite;   
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14be0 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   Bytes written b
14bf0 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65  y each WriteFile
14c00 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44  () call */.    D
14c10 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
14c20 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20   NO_ERROR;   /* 
14c30 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
14c40 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
14c50 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
14c60 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
14c70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
14c80 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
14c90 29 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ).    memset(&ov
14ca0 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
14cb0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
14cc0 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
14cd0 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
14ce0 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
14cf0 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c  ffff);.    overl
14d00 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
14d10 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
14d20 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
14d30 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  fff);.#endif..  
14d40 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
14d50 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
14d60 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65  _WINCE || define
14d70 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
14d80 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
14d90 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
14da0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
14db0 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
14dc0 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  te, 0) ){.#else.
14dd0 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
14de0 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
14df0 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
14e00 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65  rite, &overlappe
14e10 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  d) ){.#endif.   
14e20 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72       if( winRetr
14e30 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
14e40 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
14e50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
14e60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14e70 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72       assert( nWr
14e80 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
14e90 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b  <=(DWORD)nRem );
14ea0 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
14eb0 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28  e==0 || nWrite>(
14ec0 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20  DWORD)nRem ){.  
14ed0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
14ee0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
14ef0 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
14f00 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  k;.      }.#if !
14f10 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
14f20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14f30 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
14f40 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20 6f 66  LAPPED).      of
14f50 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  fset += nWrite;.
14f60 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
14f70 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
14f80 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
14f90 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65  ffff);.      ove
14fa0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
14fb0 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
14fc0 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
14fd0 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  fffff);.#endif. 
14fe0 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72       aRem += nWr
14ff0 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20  ite;.      nRem 
15000 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d  -= nWrite;.    }
15010 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20  .    if( nRem>0 
15020 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
15030 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
15040 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
15050 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
15060 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15070 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c  if(   ( pFile->l
15080 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
15090 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c  HANDLE_DISK_FULL
150a0 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70   ).       || ( p
150b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
150c0 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c  =ERROR_DISK_FULL
150d0 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41   )){.      OSTRA
150e0 43 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25  CE(("WRITE pid=%
150f0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15100 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
15110 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20  _FULL\n",.      
15120 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
15130 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
15140 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
15150 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
15160 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
15170 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65  LITE_FULL, pFile
15180 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31        "winWrite1
151b0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
151c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
151d0 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64 3d  ACE(("WRITE pid=
151e0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
151f0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15200 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22  E_IOERR_WRITE\n"
15210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
15220 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15230 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15240 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
15250 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
15260 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
15270 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
15280 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
152a0 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c  winWrite2", pFil
152b0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
152c0 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
152d0 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49  err(nRetry, __LI
152e0 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  NE__);.  }.  OST
152f0 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
15300 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
15310 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15320 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
15330 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
15340 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
15350 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
15360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15370 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
15380 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
15390 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
153a0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
153b0 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74  c int winTruncat
153c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
153d0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
153e0 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46  4 nByte){.  winF
153f0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
15400 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
15410 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile handle objec
15420 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
15430 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
15440 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15450 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66   code for this f
15460 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f  unction */.  DWO
15470 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
15480 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
15490 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
154a0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
154b0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
154c0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
154d0 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c  RUNCATE pid=%lu,
154e0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
154f0 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c  %p, size=%lld, l
15500 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
15510 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
15520 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15530 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
15540 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f  nByte, pFile->lo
15550 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
15560 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
15570 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
15580 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
15590 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
155a0 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
155b0 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
155c0 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
155d0 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
155e0 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
155f0 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
15600 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
15610 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
15620 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
15630 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
15640 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
15650 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
15660 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
15670 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
15680 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
15690 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
156a0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
156b0 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46  ..  /* SetEndOfF
156c0 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f  ile() returns no
156d0 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63  n-zero when succ
156e0 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20  essful, or zero 
156f0 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a  when it fails. *
15700 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  /.  if( winSeekF
15710 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
15720 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  ) ){.    rc = wi
15730 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15740 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
15750 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15760 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15770 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
15780 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
15790 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
157a0 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
157b0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26  File(pFile->h) &
157c0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  &.            ((
157d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
157e0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
157f0 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44  RROR_USER_MAPPED
15800 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46  _FILE) ){.    pF
15810 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15820 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
15830 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
15840 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
15850 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
15860 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15880 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70  winTruncate2", p
15890 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
158a0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
158b0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
158c0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
158d0 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
158e0 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
158f0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
15900 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65  y.  ** mapped re
15910 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
15920 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
15930 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
15940 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a   SQLite will.  *
15950 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
15960 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
15970 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
15980 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
15990 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ow on..  */.  if
159a0 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
159b0 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69  ion && nByte<pFi
159c0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
159d0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
159e0 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ize = nByte;.  }
159f0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
15a00 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 70 69  CE(("TRUNCATE pi
15a10 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
15a20 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
15a30 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
15a40 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15a50 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15a60 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
15a70 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
15a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
15a90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15aa0 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
15ab0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
15ac0 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
15ad0 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
15ae0 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
15af0 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
15b00 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
15b10 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
15b20 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
15b30 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
15b40 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
15b50 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
15b60 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
15b70 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
15b80 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
15b90 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
15ba0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
15bb0 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
15bc0 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73  ic int winSync(s
15bd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15be0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66   int flags){.#if
15bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  ndef SQLITE_NO_S
15c00 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  YNC.  /*.  ** Us
15c10 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c  ed only when SQL
15c20 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
15c30 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a  ot defined..   *
15c40 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e  /.  BOOL rc;.#en
15c50 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
15c60 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66  (NDEBUG) || !def
15c70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
15c80 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65  YNC) || \.    de
15c90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
15ca0 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 2f 2a  E_OS_TRACE).  /*
15cb0 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
15cc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
15cd0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
15ce0 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
15cf0 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
15d00 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
15d10 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
15d20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
15d30 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
15d40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15d50 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
15d60 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15d70 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
15d80 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
15d90 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
15da0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
15db0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
15dc0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
15dd0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
15de0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
15df0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
15e00 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
15e10 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
15e20 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
15e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
15e40 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
15e50 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
15e60 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
15e70 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
15e80 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
15e90 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
15ea0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
15eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
15ec0 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
15ed0 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c  (("SYNC pid=%lu,
15ee0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
15ef0 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f  %p, flags=%x, lo
15f00 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
15f10 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
15f20 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
15f30 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 66  ile, pFile->h, f
15f40 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
15f50 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15f60 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
15f70 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
15f80 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
15f90 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
15fa0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
15fb0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
15fc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
15fd0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
15fe0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
15ff0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
16000 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
16010 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
16020 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16030 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
16040 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
16050 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
16060 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
16070 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e  OSTRACE(("SYNC-N
16080 4f 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  OP pid=%lu, pFil
16090 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
160a0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
160b0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
160c0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
160d0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
160e0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
160f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
16100 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
16110 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
16120 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
16130 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ion ){.    if( o
16140 73 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65  sFlushViewOfFile
16150 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
16160 6f 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  on, 0) ){.      
16170 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d  OSTRACE(("SYNC-M
16180 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
16190 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
161a0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
161b0 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
161c0 45 5f 4f 4b 5c 6e 22 2c 20 6f 73 47 65 74 43 75  E_OK\n", osGetCu
161d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
161e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
161f0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70   pFile, pFile->p
16200 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
16210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
16220 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16230 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16240 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
16250 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64  (("SYNC-MMAP pid
16260 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16270 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
16280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16290 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  "rc=SQLITE_IOERR
162a0 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43  _MMAP\n", osGetC
162b0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
162c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
162d0 20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e    pFile, pFile->
162e0 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20  pMapRegion));.  
162f0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
16300 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
16310 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
16320 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 22 77 69 6e 53 79 6e 63 31 22 2c       "winSync1",
16350 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16360 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
16370 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46  .  rc = osFlushF
16380 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65  ileBuffers(pFile
16390 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ->h);.  Simulate
163a0 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53  IOError( rc=FALS
163b0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  E );.  if( rc ){
163c0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
163d0 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  YNC pid=%lu, pFi
163e0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
163f0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
16410 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
16420 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
16430 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
16440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
16460 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16470 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16480 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
16490 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46  SYNC pid=%lu, pF
164a0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
164b0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
164c0 5f 46 53 59 4e 43 5c 6e 22 2c 0a 20 20 20 20 20  _FSYNC\n",.     
164d0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
164e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
164f0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16500 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
16510 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
16520 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70  E_IOERR_FSYNC, p
16530 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
16540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16550 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
16560 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
16570 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
16580 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
16590 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
165a0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
165b0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
165c0 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73  nt winFileSize(s
165d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
165e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
165f0 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c  pSize){.  winFil
16600 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
16610 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
16620 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16630 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
16640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 69  );.  assert( pSi
16650 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  ze!=0 );.  Simul
16660 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
16670 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
16680 53 54 41 54 29 3b 0a 20 20 4f 53 54 52 41 43 45  STAT);.  OSTRACE
16690 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c  (("SIZE file=%p,
166a0 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46   pSize=%p\n", pF
166b0 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b  ile->h, pSize));
166c0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
166d0 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49  WINRT.  {.    FI
166e0 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f  LE_STANDARD_INFO
166f0 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f   info;.    if( o
16700 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
16710 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46  ionByHandleEx(pF
16720 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e  ile->h, FileStan
16730 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20  dardInfo,.      
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
16760 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
16770 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  o)) ){.      *pS
16780 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66  ize = info.EndOf
16790 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20  File.QuadPart;. 
167a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
167b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
167c0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
167d0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
167e0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
167f0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
16800 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16820 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
16830 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
16840 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
16850 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44  .#else.  {.    D
16860 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a  WORD upperBits;.
16870 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42      DWORD lowerB
16880 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
16890 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c  astErrno;..    l
168a0 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74  owerBits = osGet
168b0 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e  FileSize(pFile->
168c0 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a  h, &upperBits);.
168d0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28      *pSize = (((
168e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
168f0 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
16900 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69  lowerBits;.    i
16910 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
16920 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
16930 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20  SIZE).       && 
16940 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
16950 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
16960 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20  =NO_ERROR) ){.  
16970 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
16980 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
16990 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
169a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
169b0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
169c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
169f0 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
16a00 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
16a10 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
16a20 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70  "SIZE file=%p, p
16a30 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d  Size=%p, *pSize=
16a40 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %lld, rc=%s\n",.
16a50 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16a60 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69  ->h, pSize, *pSi
16a70 7a 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  ze, sqlite3ErrNa
16a80 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
16a90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16aa0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
16ab0 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
16ac0 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
16ad0 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
16ae0 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
16af0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
16b00 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
16b10 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
16b20 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
16b30 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  ..#ifndef LOCKFI
16b40 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
16b50 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  K.# define LOCKF
16b60 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
16b70 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  CK 2.#endif../*.
16b80 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c  ** Historically,
16b90 20 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64   SQLite has used
16ba0 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69   both the LockFi
16bb0 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45  le and LockFileE
16bc0 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20  x functions..** 
16bd0 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c  When the LockFil
16be0 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75  e function was u
16bf0 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61  sed, it was alwa
16c00 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66  ys expected to f
16c10 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ail.** immediate
16c20 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ly if the lock c
16c30 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61  ould not be obta
16c40 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20  ined.  Also, it 
16c50 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20  always expected 
16c60 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20  to.** obtain an 
16c70 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
16c80 20 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65   These flags are
16c90 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c   used with the L
16ca0 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
16cb0 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63  on.** and reflec
16cc0 74 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74  t those expectat
16cd0 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ions; therefore,
16ce0 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74   they should not
16cf0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
16d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
16d10 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20  OCKFILE_FLAGS.# 
16d20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f  define SQLITE_LO
16d30 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28  CKFILE_FLAGS   (
16d40 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
16d50 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20  MEDIATELY | \.  
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
16d90 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a  VE_LOCK).#endif.
16da0 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79  ./*.** Currently
16db0 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63  , SQLite never c
16dc0 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c  alls the LockFil
16dd0 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  eEx function wit
16de0 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65  hout wanting the
16df0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c  .** call to fail
16e00 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20   immediately if 
16e10 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
16e20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a  be obtained..*/.
16e30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
16e40 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a  OCKFILEEX_FLAGS.
16e50 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
16e60 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
16e70 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f   (LOCKFILE_FAIL_
16e80 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e  IMMEDIATELY).#en
16e90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
16ea0 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
16eb0 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
16ec0 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
16ed0 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
16ee0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
16ef0 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
16f00 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n9x or WinNT..*/
16f10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
16f20 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  etReadLock(winFi
16f30 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
16f40 74 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45  t res;.  OSTRACE
16f50 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c  (("READ-LOCK fil
16f60 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  e=%p, lock=%d\n"
16f70 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
16f80 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e->locktype));. 
16f90 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
16fa0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
16fb0 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20  INCE.    /*.    
16fc0 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
16fd0 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
16fe0 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
16ff0 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
17000 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a  the Win32.    **
17010 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46         API LockF
17020 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  ileEx..    */.  
17030 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63    res = winceLoc
17040 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17050 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
17060 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  , 1, 0);.#else. 
17070 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
17080 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17090 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
170a0 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  X_FLAGS, SHARED_
170b0 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170d0 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
170e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
170f0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
17100 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
17110 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
17120 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
17130 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
17140 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
17150 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
17160 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20  = (short)((lk & 
17170 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
17180 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a  RED_SIZE - 1));.
17190 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
171a0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
171b0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
171c0 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
171e0 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
171f0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
17200 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
17210 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
17220 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   == 0 ){.    pFi
17230 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17240 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
17250 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ;.    /* No need
17260 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72   to log a failur
17270 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  e to lock */.  }
17280 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
17290 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  D-LOCK file=%p, 
172a0 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46  result=%d\n", pF
172b0 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
172c0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
172d0 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61  /*.** Undo a rea
172e0 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  dlock.*/.static 
172f0 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61  int winUnlockRea
17300 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
17310 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
17320 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
17330 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  rno;.  OSTRACE((
17340 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
17350 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  e=%p, lock=%d\n"
17360 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
17370 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e->locktype));. 
17380 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
17390 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
173a0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
173b0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
173c0 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
173d0 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  , 0);.  }.#ifdef
173e0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
173f0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
17400 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
17410 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17420 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  , SHARED_FIRST+p
17430 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
17440 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
17450 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
17460 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73   res==0 && ((las
17470 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17480 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
17490 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b  R_NOT_LOCKED) ){
174a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
174b0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
174c0 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
174d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
174e0 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c  UNLOCK, pFile->l
174f0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
17500 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
17510 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
17520 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
17530 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
17540 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
17550 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
17560 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
17570 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
17580 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
17590 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
175a0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
175b0 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
175c0 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
175d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
175e0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
175f0 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
17600 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
17610 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
17620 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
17630 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
17640 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
17650 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
17660 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
17670 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
17680 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
17690 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
176a0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
176b0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
176c0 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
176d0 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
176e0 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
176f0 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
17700 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
17710 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
17720 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
17730 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
17740 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
17750 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
17760 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
17770 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
17780 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
17790 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
177a0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
177b0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
177c0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
177d0 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
177e0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
177f0 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
17800 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
17810 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
17820 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
17830 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
17840 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
17850 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
17860 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
17870 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
17880 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
17890 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
178a0 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
178b0 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
178c0 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
178d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
178e0 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
178f0 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
17900 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
17910 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
17920 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
17930 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
17940 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
17950 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17960 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
17970 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17980 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
17990 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
179a0 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
179b0 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
179c0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
179d0 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
179e0 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
179f0 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
17a00 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
17a10 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
17a20 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
17a30 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
17a40 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
17a50 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
17a60 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
17a70 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
17a80 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
17a90 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
17aa0 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
17ab0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
17ac0 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
17ad0 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
17ae0 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
17af0 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
17b00 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17b20 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
17b30 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
17b40 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
17b50 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
17b60 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
17b70 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
17b80 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
17b90 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
17ba0 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
17bb0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
17bc0 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
17bd0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
17be0 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
17bf0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
17c00 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
17c10 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
17c20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
17c30 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
17c40 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
17c50 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  HELD file=%p, rc
17c60 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
17c70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
17c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  .  }..  /* Do no
17ca0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 6b 69 6e 64  t allow any kind
17cb0 20 6f 66 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f   of write-lock o
17cc0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
17cd0 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66  tabase.  */.  if
17ce0 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  ( (pFile->ctrlFl
17cf0 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
17d00 4f 4e 4c 59 29 21 3d 30 20 26 26 20 6c 6f 63 6b  ONLY)!=0 && lock
17d10 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
17d20 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
17d30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
17d40 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  OCK;.  }..  /* M
17d50 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
17d60 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
17d70 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
17d80 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
17d90 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
17da0 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
17db0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
17dc0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
17dd0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
17de0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
17df0 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
17e00 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
17e10 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
17e20 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
17e30 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
17e40 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
17e50 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
17e60 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
17e70 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
17e80 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
17e90 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
17ea0 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
17eb0 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
17ec0 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
17ed0 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
17ee0 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
17ef0 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
17f00 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20  ocktype;.  if(  
17f10 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
17f20 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20  e==NO_LOCK).    
17f30 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70   || (   (locktyp
17f40 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
17f50 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  K).         && (
17f60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
17f70 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29  =RESERVED_LOCK))
17f80 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
17f90 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
17fa0 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
17fb0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
17fc0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
17fd0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
17fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49             PENDI
18010 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
18020 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
18030 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
18040 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
18050 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20   lock.  This is 
18060 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20  needed to work. 
18070 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70       ** around p
18080 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
18090 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f  y indexing and/o
180a0 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66  r anti-virus sof
180b0 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a  tware on.      *
180c0 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
180d0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79  s..      ** If y
180e0 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  ou are using thi
180f0 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65  s code as a mode
18100 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76  l for alternativ
18110 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a  e VFSes, do not.
18120 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68        ** copy th
18130 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20  is retry logic. 
18140 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e   It is a hack in
18150 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f  tended for Windo
18160 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  ws only..      *
18170 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  /.      lastErrn
18180 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
18190 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
181a0 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49  ACE(("LOCK-PENDI
181b0 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  NG-FAIL file=%p,
181c0 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c   count=%d, resul
181d0 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
181e0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
181f0 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20  , cnt, res));.  
18200 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
18210 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44  o==ERROR_INVALID
18220 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20  _HANDLE ){.     
18230 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
18240 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
18250 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
18260 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
18270 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
18280 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
18290 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
182a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
182b0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
182c0 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65  ->h, cnt, sqlite
182d0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
182e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
182f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18300 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74   if( cnt ) sqlit
18310 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
18320 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
18330 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65  PendingLock = re
18340 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20  s;.    if( !res 
18350 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  ){.      lastErr
18360 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
18370 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
18380 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
18390 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
183a0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
183b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
183c0 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
183d0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
183e0 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
183f0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74      res = winGet
18400 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
18410 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
18420 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
18430 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
18440 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18450 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
18460 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
18470 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18480 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
18490 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
184a0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
184b0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
184c0 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
184d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
184e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
184f0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
18500 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
18510 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
18520 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45  E_FLAGS, RESERVE
18530 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
18540 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
18550 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
18560 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
18570 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
18580 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
18590 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
185a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
185b0 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
185c0 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
185d0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
185e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
185f0 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
18600 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
18610 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
18620 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
18630 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
18640 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
18650 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
18660 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
18670 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
18680 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
18690 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
186a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
186b0 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
186c0 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
186d0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
186e0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
186f0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
18700 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44  LE_FLAGS, SHARED
18710 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20  _FIRST, 0,.     
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
18740 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
18750 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
18760 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  pe = EXCLUSIVE_L
18770 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
18780 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
18790 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
187a0 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74  ();.      winGet
187b0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
187c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
187d0 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69   If we are holdi
187e0 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ng a PENDING loc
187f0 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20  k that ought to 
18800 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  be released, the
18810 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69  n.  ** release i
18820 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
18830 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  ( gotPendingLock
18840 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
18850 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
18860 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
18870 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
18880 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
18890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
188a0 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  te the state of 
188b0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c  the lock has hel
188c0 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  d in the file de
188d0 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20  scriptor then.  
188e0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70  ** return the ap
188f0 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74  propriate result
18900 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   code..  */.  if
18910 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20  ( res ){.    rc 
18920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
18930 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
18940 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
18950 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
18960 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18970 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
18980 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77  -FAIL file=%p, w
18990 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64  anted=%d, got=%d
189a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
189b0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b    pFile->h, lock
189c0 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70  type, newLocktyp
189d0 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  e));.  }.  pFile
189e0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
189f0 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20  )newLocktype;.  
18a00 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66  OSTRACE(("LOCK f
18a10 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
18a20 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
18a30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
18a40 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
18a50 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18a60 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
18a70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
18a80 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
18a90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
18aa0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
18ab0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
18ac0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
18ad0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
18ae0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
18af0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
18b00 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
18b10 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
18b20 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
18b30 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
18b40 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
18b50 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
18b60 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
18b70 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  es;.  winFile *p
18b80 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
18b90 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
18ba0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
18bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
18bc0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
18bd0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
18be0 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
18bf0 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c  =%p, pResOut=%p\
18c00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52  n", pFile->h, pR
18c10 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65  esOut));..  asse
18c20 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69  rt( id!=0 );.  i
18c30 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
18c40 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
18c50 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31  K ){.    res = 1
18c60 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
18c70 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
18c80 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20  e=%p, result=%d 
18c90 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c  (local)\n", pFil
18ca0 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d  e->h, res));.  }
18cb0 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
18cc0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
18cd0 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
18ce0 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52  CKFILEEX_FLAGS,R
18cf0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 30 2c 31  ESERVED_BYTE,0,1
18d00 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ,0);.    if( res
18d10 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c   ){.      winUnl
18d20 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
18d30 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
18d40 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
18d50 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65 73  }.    res = !res
18d60 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
18d70 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
18d80 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20  e=%p, result=%d 
18d90 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
18da0 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
18db0 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
18dc0 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
18dd0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
18de0 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
18df0 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
18e00 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
18e10 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18e20 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ->h, pResOut, *p
18e30 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
18e40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18e50 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
18e60 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
18e70 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
18e80 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
18e90 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
18ea0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
18eb0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
18ec0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
18ed0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
18ee0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
18ef0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
18f00 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
18f10 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
18f20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
18f30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18f40 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
18f50 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
18f60 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
18f70 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
18f80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
18f90 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
18fa0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
18fb0 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
18fc0 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
18fd0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
18fe0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
18ff0 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
19000 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
19010 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19020 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
19030 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
19040 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
19050 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
19060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19070 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
19080 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
19090 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
190a0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
190b0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
190c0 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d  ile=%p, oldLock=
190d0 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d  %d(%d), newLock=
190e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
190f0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
19100 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
19110 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
19120 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  te, locktype));.
19130 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
19140 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
19150 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
19160 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
19170 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
19180 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
19190 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
191a0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
191b0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
191c0 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74 52  LOCK && !winGetR
191d0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
191e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
191f0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
19200 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
19210 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
19220 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
19230 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
19240 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
19250 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
19260 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
19270 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
19280 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
19290 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
192a0 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
192b0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
192c0 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
192d0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
192e0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
192f0 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
19300 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
19310 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  0);.  }.  if( lo
19320 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
19330 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  && type>=SHARED_
19340 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
19350 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
19360 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
19370 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
19380 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
19390 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
193a0 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
193b0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
193c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
193d0 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
193e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
193f0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
19400 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
19410 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19420 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
19430 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
19440 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
19450 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19460 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
19470 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
19480 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
19490 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
194a0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
194b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
194c0 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
194d0 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
194e0 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
194f0 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
19500 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
19510 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
19520 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
19530 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
19540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
19550 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
19560 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
19570 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
19580 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
19590 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
195a0 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
195b0 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
195c0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
195d0 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
195e0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
195f0 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
19600 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
19610 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
19620 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
19630 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
19640 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
19650 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74  thods used for t
19660 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
19670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19680 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
19690 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20  te3_vfs *, char 
196a0 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
196b0 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
196c0 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42  oid *);.static B
196d0 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
196e0 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e  tterAndColon(con
196f0 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a  st char *);../*.
19700 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
19710 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
19720 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
19730 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
19740 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
19750 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19760 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
19770 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
19780 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
19790 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  d;.  OSTRACE(("F
197a0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70  CNTL file=%p, op
197b0 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c  =%d, pArg=%p\n",
197c0 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70   pFile->h, op, p
197d0 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28  Arg));.  switch(
197e0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
197f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
19800 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
19810 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
19820 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
19830 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
19840 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19850 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
19860 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
19870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19880 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
19890 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
198a0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
198b0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
198c0 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
198d0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
198e0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
198f0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
19900 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
19910 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
19920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19930 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
19940 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
19950 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
19960 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
19970 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
19980 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
19990 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
199a0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
199b0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
199c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
199d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
199e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
199f0 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
19a00 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
19a10 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
19a20 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
19a30 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
19a40 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
19a50 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
19a60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19a80 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
19a90 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
19aa0 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
19ab0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
19ac0 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
19ad0 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
19ae0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
19af0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
19b00 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
19b10 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
19b20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
19b30 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
19b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19b60 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
19b70 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
19b80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
19b90 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
19ba0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
19bb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
19bc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
19bd0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19be0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
19bf0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
19c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19c10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
19c20 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
19c30 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
19c40 20 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74      int bPersist
19c50 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a   = *(int*)pArg;.
19c60 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69        if( bPersi
19c70 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st<0 ){.        
19c80 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
19c90 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c  ile->bPersistWal
19ca0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19cb0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 62 50         pFile->bP
19cc0 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50 65 72  ersistWal = bPer
19cd0 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20 20 7d  sist!=0;.      }
19ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
19d00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
19d10 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
19d20 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
19d30 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
19d40 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
19d50 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
19d60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
19d70 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
19d80 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
19d90 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
19da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19dc0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
19dd0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
19de0 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
19df0 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
19e00 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
19e10 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
19e20 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19e30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
19e40 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
19e50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
19e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19e70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
19e80 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
19e90 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
19ea0 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
19eb0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
19ec0 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
19ed0 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
19ee0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19ef0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
19f00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
19f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19f20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19f30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19f40 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
19f50 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY: {.      int 
19f60 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  *a = (int*)pArg;
19f70 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e  .      if( a[0]>
19f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
19f90 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
19fa0 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
19fb0 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
19fc0 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20  inIoerrRetry;.  
19fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19fe0 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20  a[1]>0 ){.      
19ff0 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44    winIoerrRetryD
1a000 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20  elay = a[1];.   
1a010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a020 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72    a[1] = winIoer
1a030 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20  rRetryDelay;.   
1a040 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1a050 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a060 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1a070 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1a080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a090 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1a0a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a0b0 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  T.    case SQLIT
1a0c0 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45  E_FCNTL_WIN32_SE
1a0d0 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20  T_HANDLE: {.    
1a0e0 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
1a0f0 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41  e = (LPHANDLE)pA
1a100 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45  rg;.      HANDLE
1a110 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c   hOldFile = pFil
1a120 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c  e->h;.      pFil
1a130 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a  e->h = *phFile;.
1a140 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20        *phFile = 
1a150 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20  hOldFile;.      
1a160 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1a170 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46  oldFile=%p, newF
1a180 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1a190 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1a1a0 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65          hOldFile
1a1b0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1a1c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a1d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
1a1e0 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  if.    case SQLI
1a1f0 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
1a200 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
1a210 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b  har *zTFile = 0;
1a220 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1a230 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
1a240 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46  File->pVfs, &zTF
1a250 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
1a260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a270 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
1a280 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
1a290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
1a2a0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1a2b0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1a2c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
1a2d0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1a2e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a2f0 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  c;.    }.#if SQL
1a300 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1a310 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
1a320 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
1a330 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  IZE: {.      i64
1a340 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36   newLimit = *(i6
1a350 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  4*)pArg;.      i
1a360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a370 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  K;.      if( new
1a380 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
1a390 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1a3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
1a3b0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
1a3c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
1a3d0 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
1a3e0 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70   *(i64*)pArg = p
1a3f0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1a400 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  x;.      if( new
1a410 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c  Limit>=0 && newL
1a420 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61  imit!=pFile->mma
1a430 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c  pSizeMax && pFil
1a440 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  e->nFetchOut==0 
1a450 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1a460 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
1a470 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  newLimit;.      
1a480 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1a490 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
1a4a0 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c       winUnmapfil
1a4b0 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
1a4c0 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66      rc = winMapf
1a4d0 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a  ile(pFile, -1);.
1a4e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a4f0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
1a500 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a510 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
1a520 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
1a530 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1a540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a550 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f  }.#endif.  }.  O
1a560 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1a570 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1a580 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70  E_NOTFOUND\n", p
1a590 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
1a5a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
1a5b0 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
1a5c0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1a5d0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1a5e0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1a5f0 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1a600 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1a610 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1a620 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1a630 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1a640 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1a650 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1a660 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1a670 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1a680 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1a690 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1a6a0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1a6b0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1a6c0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1a6d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1a6e0 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1a6f0 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1a700 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1a710 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1a720 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1a730 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1a740 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
1a750 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  nt winSectorSize
1a760 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a770 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a  d){.  (void)id;.
1a780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a790 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1a7a0 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE;.}../*.** Re
1a7b0 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66  turn a vector of
1a7c0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1a7d0 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74  ristics..*/.stat
1a7e0 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65  ic int winDevice
1a7f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a800 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a810 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20  ){.  winFile *p 
1a820 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
1a830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a840 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
1a850 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20  E_WHEN_OPEN |.  
1a860 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c         ((p->ctrl
1a870 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
1a880 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43  PSOW)?SQLITE_IOC
1a890 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1a8a0 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a  RWRITE:0);.}../*
1a8b0 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
1a8c0 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
1a8d0 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
1a8e0 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
1a8f0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
1a900 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
1a910 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
1a920 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
1a930 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
1a940 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
1a950 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
1a960 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ity size..*/.sta
1a970 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20  tic SYSTEM_INFO 
1a980 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66  winSysInfo;..#if
1a990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a9a0 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  _WAL../*.** Help
1a9b0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
1a9c0 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
1a9d0 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
1a9e0 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
1a9f0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
1aa00 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
1aa10 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
1aa20 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 0a 2a  bjects used by.*
1aa30 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c  * this file, all
1aa40 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65   of which may be
1aa50 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
1aa60 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
1aa70 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53  ** Function winS
1aa80 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
1aa90 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
1aaa0 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
1aab0 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68 65  l mutex.** is he
1aac0 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
1aad0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1aae0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
1aaf0 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
1ab00 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
1ab10 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e  e.g..**.**   win
1ab20 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  ShmEnterMutex().
1ab30 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77  **     assert( w
1ab40 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1ab50 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c   );.**   winShmL
1ab60 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73  eaveMutex().*/.s
1ab70 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1ab80 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  mEnterMutex(void
1ab90 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
1aba0 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
1abb0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
1abc0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56  E_MUTEX_STATIC_V
1abd0 46 53 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  FS1));.}.static 
1abe0 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
1abf0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
1ac00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ac10 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
1ac20 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1ac30 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
1ac40 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  .}.#ifndef NDEBU
1ac50 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  G.static int win
1ac60 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  ShmMutexHeld(voi
1ac70 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
1ac80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ac90 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
1aca0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1acb0 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
1acc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
1acd0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
1ace0 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
1acf0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
1ad00 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
1ad10 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
1ad20 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
1ad30 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
1ad40 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
1ad50 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
1ad60 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
1ad70 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
1ad80 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
1ad90 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
1ada0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
1adb0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
1adc0 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
1add0 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
1ade0 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
1adf0 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
1ae00 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
1ae10 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
1ae20 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1ae30 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
1ae40 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
1ae50 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
1ae60 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1ae70 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
1ae80 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
1ae90 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
1aea0 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a  *      pNext.**.
1aeb0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1aec0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1aed0 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
1aee0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1aef0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69  d:.**.**      fi
1af00 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
1af10 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
1af20 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65   winShmNode.mute
1af30 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
1af40 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  r winShmNode.nRe
1af50 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53  f==0 and.** winS
1af60 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  hmMutexHeld() is
1af70 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
1af80 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
1af90 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
1afa0 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
1afb0 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74  re..**.*/.struct
1afc0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
1afd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
1afe0 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
1aff0 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
1b000 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
1b010 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
1b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1b030 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
1b040 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
1b050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b060 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
1b070 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
1b080 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
1b090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b0a0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
1b0b0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
1b0c0 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b0e0 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
1b0f0 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
1b100 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
1b110 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
1b120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1b130 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
1b140 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1b150 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
1b160 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
1b170 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1b180 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
1b190 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
1b1a0 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
1b1b0 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
1b1c0 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1e0 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
1b1f0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1b200 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
1b210 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
1b220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1b230 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
1b240 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1b250 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1b260 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1b270 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
1b280 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
1b290 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
1b2a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b2b0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1b2c0 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
1b2d0 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 6e 65  S_TRACE).  u8 ne
1b2e0 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
1b2f0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
1b300 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
1b310 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
1b320 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
1b330 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
1b340 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
1b350 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
1b360 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1b370 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
1b380 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
1b390 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
1b3a0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
1b3b0 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
1b3c0 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
1b3d0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
1b3e0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
1b3f0 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
1b400 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
1b410 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
1b420 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
1b430 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
1b440 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1b450 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1b460 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
1b470 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1b480 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
1b490 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
1b4a0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
1b4b0 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
1b4c0 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
1b4d0 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
1b4e0 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
1b4f0 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
1b500 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
1b510 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
1b520 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
1b530 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
1b540 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
1b550 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
1b560 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
1b570 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1b580 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
1b590 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
1b5a0 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
1b5b0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
1b5c0 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
1b5d0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
1b5e0 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b600 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
1b610 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
1b620 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
1b630 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
1b640 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1b650 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
1b660 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
1b670 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1b680 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
1b690 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
1b6a0 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  d */.#if defined
1b6b0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
1b6c0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1b6d0 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a  _HAVE_OS_TRACE).
1b6e0 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b700 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
1b710 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77  ction with its w
1b720 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e  inShmNode */.#en
1b730 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  dif.};../*.** Co
1b740 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
1b750 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
1b760 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45  ine WIN_SHM_BASE
1b770 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
1b780 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
1b790 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
1b7a0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
1b7b0 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20  e WIN_SHM_DMS   
1b7c0 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53   (WIN_SHM_BASE+S
1b7d0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1b7e0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
1b7f0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
1b800 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  ply advisory loc
1b810 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74  ks for all n byt
1b820 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  es beginning at 
1b830 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ofst..*/.#define
1b840 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23   _SHM_UNLCK  1.#
1b850 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43  define _SHM_RDLC
1b860 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  2.#define _SH
1b870 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69  M_WRLCK  3.stati
1b880 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74  c int winShmSyst
1b890 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d  emLock(.  winShm
1b8a0 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  Node *pFile,    
1b8b0 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
1b8c0 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
1b8d0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
1b8e0 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
1b8f0 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ype,         /* 
1b900 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d  _SHM_UNLCK, _SHM
1b910 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f  _RDLCK, or _SHM_
1b920 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
1b930 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1b940 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69   /* Offset to fi
1b950 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c  rst byte to be l
1b960 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a  ocked/unlocked *
1b970 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20  /.  int nByte   
1b980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b990 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1b9a0 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a  lock or unlock *
1b9b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1b9c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1b9d0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
1b9e0 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65   Lock/UnlockFile
1b9f0 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  Ex() */..  /* Ac
1ba00 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53  cess to the winS
1ba10 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
1ba20 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
1ba30 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
1ba40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ba50 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d  utex_held(pFile-
1ba60 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65  >mutex) || pFile
1ba70 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
1ba80 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1ba90 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
1baa0 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20  =%d, offset=%d, 
1bab0 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  size=%d\n",.    
1bac0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46         pFile->hF
1bad0 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c  ile.h, lockType,
1bae0 20 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a   ofst, nByte));.
1baf0 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63  .  /* Release/Ac
1bb00 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d  quire the system
1bb10 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20  -level lock */. 
1bb20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f   if( lockType==_
1bb30 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  SHM_UNLCK ){.   
1bb40 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46   rc = winUnlockF
1bb50 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c  ile(&pFile->hFil
1bb60 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  e.h, ofst, 0, nB
1bb70 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
1bb80 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
1bb90 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
1bba0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1bbb0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20    DWORD dwFlags 
1bbc0 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  = LOCKFILE_FAIL_
1bbd0 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20  IMMEDIATELY;.   
1bbe0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d   if( lockType ==
1bbf0 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77   _SHM_WRLCK ) dw
1bc00 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c  Flags |= LOCKFIL
1bc10 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
1bc20 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
1bc30 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
1bc40 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c  File.h, dwFlags,
1bc50 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
1bc60 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
1bc70 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63  rc!= 0 ){.    rc
1bc80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bc90 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1bca0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f  ->lastErrno =  o
1bcb0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1bcc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1bcd0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _BUSY;.  }..  OS
1bce0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1bcf0 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25   file=%p, func=%
1bd00 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63  s, errno=%lu, rc
1bd10 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1bd20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e     pFile->hFile.
1bd30 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  h, (lockType == 
1bd40 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77  _SHM_UNLCK) ? "w
1bd50 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a  inUnlockFile" :.
1bd60 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c             "winL
1bd70 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  ockFile", pFile-
1bd80 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69  >lastErrno, sqli
1bd90 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1bda0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1bdb0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
1bdc0 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
1bdd0 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69  methods */.stati
1bde0 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71  c int winOpen(sq
1bdf0 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74  lite3_vfs*,const
1be00 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66   char*,sqlite3_f
1be10 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a  ile*,int,int*);.
1be20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
1be30 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
1be40 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69   *,const char*,i
1be50 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  nt);../*.** Purg
1be60 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  e the winShmNode
1be70 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
1be80 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69   entries with wi
1be90 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
1bea0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1beb0 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
1bec0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
1bed0 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
1bee0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
1bef0 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
1bf00 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
1bf10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bf20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69  winShmPurge(sqli
1bf30 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1bf40 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a  nt deleteFlag){.
1bf50 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70    winShmNode **p
1bf60 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  p;.  winShmNode 
1bf70 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69  *p;.  assert( wi
1bf80 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1bf90 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1bfa0 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75  HM-PURGE pid=%lu
1bfb0 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c  , deleteFlag=%d\
1bfc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1bfd0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1bfe0 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c  ssId(), deleteFl
1bff0 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69  ag));.  pp = &wi
1c000 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
1c010 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29  while( (p = *pp)
1c020 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
1c030 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1c040 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1c050 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20  if( p->mutex ){ 
1c060 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
1c070 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a  ee(p->mutex); }.
1c080 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c090 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
1c0a0 29 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20  ){.        BOOL 
1c0b0 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65  bRc = osUnmapVie
1c0c0 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69  wOfFile(p->aRegi
1c0d0 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20  on[i].pMap);.   
1c0e0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1c0f0 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70  HM-PURGE-UNMAP p
1c100 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1c110 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1c130 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1c140 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
1c150 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1c160 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45  );.        UNUSE
1c170 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1c180 28 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62  (bRc);.        b
1c190 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  Rc = osCloseHand
1c1a0 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
1c1b0 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .hMap);.        
1c1c0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1c1d0 52 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c  RGE-CLOSE pid=%l
1c1e0 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
1c1f0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1c200 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c210 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c220 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
1c230 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1c240 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52        UNUSED_VAR
1c250 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29  IABLE_VALUE(bRc)
1c260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c270 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d  if( p->hFile.h!=
1c280 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65  NULL && p->hFile
1c290 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  .h!=INVALID_HAND
1c2a0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
1c2b0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1c2c0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1c2d0 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
1c2e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1c2f0 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
1c300 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1c310 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1c320 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
1c330 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
1c340 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1c350 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1c360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
1c370 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
1c380 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
1c390 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
1c3a0 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
1c3b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
1c3c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1c3d0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1c3e0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1c3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1c400 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
1c410 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1c420 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
1c430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1c440 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
1c450 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
1c460 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1c470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
1c480 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1c490 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
1c4a0 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
1c4b0 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a  ile pDbFd..**.**
1c4c0 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1c4d0 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
1c4e0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
1c4f0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
1c500 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
1c510 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
1c520 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
1c530 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
1c540 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
1c550 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
1c560 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
1c570 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
1c580 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
1c590 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
1c5a0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72   int winOpenShar
1c5b0 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65  edMemory(winFile
1c5c0 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
1c5d0 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c5f0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1c600 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
1c610 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1c620 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
1c630 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
1c640 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
1c650 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
1c660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c680 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1c690 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
1c6a0 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
1c6b0 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
1c6c0 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
1c6d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
1c6e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c700 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
1c710 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
1c720 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
1c730 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
1c740 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
1c750 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1c760 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
1c770 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
1c780 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
1c790 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
1c7a0 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
1c7b0 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
1c7c0 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
1c7d0 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
1c7e0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1c7f0 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
1c800 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1c810 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c820 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6e 4e  NOMEM_BKPT;.  nN
1c830 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
1c840 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61  len30(pDbFd->zPa
1c850 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  th);.  pNew = sq
1c860 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1c870 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
1c880 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20  e) + nName + 17 
1c890 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
1c8a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c8b0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
1c8c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1c8d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
1c8e0 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  .  pNew->zFilena
1c8f0 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
1c900 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  w[1];.  sqlite3_
1c910 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31  snprintf(nName+1
1c920 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  5, pNew->zFilena
1c930 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
1c940 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73  bFd->zPath);.  s
1c950 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
1c960 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  3(pDbFd->zPath, 
1c970 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
1c980 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20  ;..  /* Look to 
1c990 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
1c9a0 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53  an existing winS
1c9b0 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20  hmNode that can 
1c9c0 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66  be used..  ** If
1c9d0 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e   no matching win
1c9e0 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ShmNode currentl
1c9f0 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65  y exists, create
1ca00 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
1ca10 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1ca20 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68  tex();.  for(pSh
1ca30 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f  mNode = winShmNo
1ca40 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65  deList; pShmNode
1ca50 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e  ; pShmNode=pShmN
1ca60 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ode->pNext){.   
1ca70 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20   /* TBD need to 
1ca80 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74  come up with bet
1ca90 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20  ter match here. 
1caa0 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20   Perhaps.    ** 
1cab0 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48  use FILE_ID_BOTH
1cac0 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74  _DIR_INFO Struct
1cad0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
1cae0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1caf0 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  mp(pShmNode->zFi
1cb00 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46  lename, pNew->zF
1cb10 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ilename)==0 ) br
1cb20 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
1cb30 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73  ShmNode ){.    s
1cb40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1cb50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cb60 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b  pShmNode = pNew;
1cb70 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
1cb80 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26     ((winFile*)(&
1cb90 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29  pShmNode->hFile)
1cba0 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  )->h = INVALID_H
1cbb0 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
1cbc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74   pShmNode->pNext
1cbd0 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
1cbe0 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64  t;.    winShmNod
1cbf0 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65  eList = pShmNode
1cc00 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  ;..    pShmNode-
1cc10 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
1cc20 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1cc30 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1cc40 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
1cc50 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
1cc60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cc70 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
1cc80 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
1cc90 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1cca0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
1ccb0 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
1ccc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ccd0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
1cce0 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
1ccf0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1cd00 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
1cd10 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1cd20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1cd30 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1cd40 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
1cd50 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1cd70 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
1cd80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1cd90 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1cda0 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20  EN_CREATE,.     
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
1cdc0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1cdd0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67  K!=rc ){.      g
1cde0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1cdf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ce00 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1ce10 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1ce20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
1ce30 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
1ce40 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
1ce50 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1ce60 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
1ce70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ce80 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1ce90 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1cea0 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
1ceb0 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
1cec0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1ced0 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1cee0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1cef0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
1cf00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1cf10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cf20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1cf30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1cf40 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
1cf50 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53         "winOpenS
1cf80 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1cf90 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1cfa0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1cfb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cfc0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1cfd0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1cfe0 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1cff0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  DMS, 1);.      r
1d000 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1d010 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1d020 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_RDLCK, WIN_S
1d030 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1d040 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
1d050 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1d060 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1d070 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
1d080 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
1d090 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  he winShmNode */
1d0a0 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
1d0b0 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 20 64   pShmNode;.#if d
1d0c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1d0d0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1d0e0 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
1d0f0 52 41 43 45 29 0a 20 20 70 2d 3e 69 64 20 3d 20  RACE).  p->id = 
1d100 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
1d110 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
1d120 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
1d130 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
1d140 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  = p;.  winShmLea
1d150 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
1d160 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
1d170 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
1d180 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d190 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
1d1a0 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
1d1b0 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  er of the winShm
1d1c0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
1d1d0 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
1d1e0 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
1d1f0 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e   new (struct win
1d200 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
1d210 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
1d220 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
1d230 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
1d240 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
1d250 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1d260 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
1d270 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
1d280 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
1d290 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
1d2a0 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
1d2b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
1d2c0 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a  Node->mutex.  **
1d2d0 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
1d2e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1d2f0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1d300 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
1d310 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
1d320 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
1d330 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
1d340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1d350 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1d360 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1d370 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
1d380 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
1d390 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
1d3a0 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79  _err:.  winShmSy
1d3b0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1d3c0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1d3d0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1d3e0 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
1d3f0 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
1d400 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1d410 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
1d420 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
1d430 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1d440 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1d450 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
1d460 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1d470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d480 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
1d490 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
1d4a0 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
1d4b0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1d4c0 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
1d4d0 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
1d4e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d4f0 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  winShmUnmap(.  s
1d500 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1d510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1d520 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1d530 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1d540 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
1d550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d560 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73  elete after clos
1d570 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ing if true */.)
1d580 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1d590 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Fd;       /* Dat
1d5a0 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1d5b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared-memory */. 
1d5c0 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1d5d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1d5e0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
1d5f0 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  losed */.  winSh
1d600 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1d610 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1d620 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1d630 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68   file */.  winSh
1d640 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
1d650 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1d660 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
1d670 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70  nections */..  p
1d680 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1d690 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
1d6a0 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
1d6b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1d6c0 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
1d6d0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1d6e0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
1d6f0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
1d700 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
1d710 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
1d720 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
1d730 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
1d740 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1d750 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1d760 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
1d770 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
1d780 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
1d790 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
1d7a0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
1d7b0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
1d7c0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
1d7d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1d7e0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1d7f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
1d800 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1d810 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
1d820 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
1d830 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
1d840 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
1d850 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
1d860 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1d870 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69  ile, too */.  wi
1d880 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1d890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1d8a0 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
1d8b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1d8c0 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
1d8d0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
1d8e0 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70     winShmPurge(p
1d8f0 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65  DbFd->pVfs, dele
1d900 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77  teFlag);.  }.  w
1d910 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1d920 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1d930 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d940 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
1d950 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
1d960 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1d970 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1d980 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20  t winShmLock(.  
1d990 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1d9a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
1d9b0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
1d9c0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1d9d0 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
1d9e0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1d9f0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
1da00 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
1da10 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1da20 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
1da30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1da40 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
1da50 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1da60 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1da70 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1da80 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1da90 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
1daa0 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1dab0 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1dac0 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  *)fd;        /* 
1dad0 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
1dae0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1daf0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20   */.  winShm *p 
1db00 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
1db10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1db20 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1db30 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
1db40 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20  .  winShm *pX;  
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1db70 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
1db80 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77   siblings */.  w
1db90 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1dba0 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1dbb0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1dbc0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1dbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dbe0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
1dbf0 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1dc20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
1dc30 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
1dc40 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
1dc50 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
1dc60 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
1dc70 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
1dc80 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
1dc90 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1dca0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1dcb0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1dcc0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1dcd0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1dce0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1dcf0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1dd00 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1dd10 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1dd20 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1dd30 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1dd40 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1dd50 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1dd60 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
1dd70 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
1dd80 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
1dd90 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
1dda0 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28  .  mask = (u16)(
1ddb0 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d  (1U<<(ofst+n)) -
1ddc0 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20   (1U<<ofst));.  
1ddd0 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
1dde0 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
1ddf0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1de00 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1de10 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1de20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1de30 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
1de40 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
1de50 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
1de60 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
1de70 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
1de80 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
1de90 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
1dea0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
1deb0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1dec0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1ded0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1dee0 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
1def0 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
1df00 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
1df10 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
1df20 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
1df30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
1df40 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
1df50 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1df60 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
1df70 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1df80 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
1df90 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
1dfa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1dfb0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1dfc0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1dfd0 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _UNLCK, ofst+WIN
1dfe0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1dff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e010 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1e020 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
1e030 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1e040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e050 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1e060 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
1e070 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
1e080 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
1e090 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1e0a0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
1e0b0 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
1e0c0 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
1e0d0 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
1e0e0 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
1e0f0 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
1e100 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
1e110 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
1e120 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
1e130 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
1e140 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1e150 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
1e160 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
1e170 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
1e180 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
1e190 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
1e1a0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
1e1b0 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
1e1c0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1e1d0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1e1e0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1e1f0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1e200 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1e210 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e220 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1e230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e240 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
1e250 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
1e260 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1e270 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
1e280 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1e290 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
1e2a0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
1e2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e2c0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
1e2d0 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
1e2e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1e2f0 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1e300 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1e310 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_RDLCK, ofst+WI
1e320 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1e330 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e340 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e350 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1e360 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
1e370 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
1e380 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
1e390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e3a0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
1e3b0 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
1e3c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e3d0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
1e3e0 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
1e3f0 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
1e400 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
1e410 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
1e420 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
1e430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1e440 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
1e450 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1e460 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1e470 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1e480 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1e490 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1e4a0 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
1e4b0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1e4c0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1e4d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1e4e0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1e4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e500 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1e510 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1e520 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1e530 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
1e540 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
1e550 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
1e560 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
1e570 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
1e580 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1e590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e5a0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1e5b0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1e5c0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1e5d0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1e5e0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
1e5f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e600 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e610 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
1e620 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
1e630 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
1e640 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e660 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e670 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1e680 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
1e690 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64  E(("SHM-LOCK pid
1e6a0 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61  =%lu, id=%d, sha
1e6b0 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78  redMask=%03x, ex
1e6c0 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d  clMask=%03x, rc=
1e6d0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1e6e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1e6f0 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64  ocessId(), p->id
1e700 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
1e710 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
1e720 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e730 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1e740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e750 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
1e760 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
1e770 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
1e780 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1e790 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64  ..**.** All load
1e7a0 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
1e7b0 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
1e7c0 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
1e7d0 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
1e7e0 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
1e7f0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
1e800 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
1e810 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
1e820 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
1e830 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
1e840 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1e850 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
1e860 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1e870 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1e880 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  R(fd);.  sqlite3
1e890 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
1e8a0 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64     /* compiler-d
1e8b0 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61  efined memory ba
1e8c0 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
1e8d0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20  mEnterMutex();  
1e8e0 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74       /* Also mut
1e8f0 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e  ex, for redundan
1e900 63 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65  cy */.  winShmLe
1e910 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
1e920 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e930 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1e940 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
1e950 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
1e960 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61  on of the.** sha
1e970 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1e980 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1e990 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1e9a0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1e9b0 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75  egions.** are nu
1e9c0 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
1e9d0 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
1e9e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1e9f0 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
1ea00 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1ea10 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
1ea20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
1ea30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1ea40 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
1ea50 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1ea60 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1ea70 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70  if the isWrite p
1ea80 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
1ea90 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1eaa0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
1eab0 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1eac0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1ead0 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
1eae0 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
1eaf0 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
1eb00 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
1eb10 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
1eb20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
1eb30 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1eb40 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  If.** isWrite is
1eb50 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
1eb60 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1eb70 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1eb80 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20   has not yet.** 
1eb90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1eba0 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1ebb0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1ebc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1ebd0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1ebe0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1ebf0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1ec00 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1ec10 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1ec20 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1ec30 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1ec40 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1ec50 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64 72  rocesses.** addr
1ec60 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
1ec70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
1ec80 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
1ec90 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
1eca0 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ped.** memory an
1ecb0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1ecc0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ecd0 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
1ece0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1ecf0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1ed00 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
1ed10 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
1ed20 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
1ed30 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1ed40 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
1ed50 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
1ed60 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
1ed90 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
1eda0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
1edb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1edc0 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
1edd0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1ede0 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1edf0 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
1ee00 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
1ee10 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
1ee20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
1ee30 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
1ee40 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20   winShm *pShm = 
1ee50 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
1ee60 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1ee70 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1ee80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1ee90 28 20 21 70 53 68 6d 20 29 7b 0a 20 20 20 20 72  ( !pShm ){.    r
1eea0 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
1eeb0 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
1eec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1eed0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1eee0 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20 70 44  c;.    pShm = pD
1eef0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
1ef00 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d   pShmNode = pShm
1ef10 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
1ef20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ef30 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1ef40 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1ef50 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1ef60 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1ef70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1ef80 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
1ef90 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
1efa0 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
1efb0 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
1efc0 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
1efd0 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
1efe0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
1eff0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
1f000 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
1f010 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
1f020 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1f030 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
1f040 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
1f050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1f060 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
1f070 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
1f080 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1f090 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
1f0a0 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
1f0b0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1f0c0 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
1f0d0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1f0e0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1f0f0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
1f100 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
1f110 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1f120 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
1f130 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
1f140 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
1f150 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
1f160 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1f170 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
1f180 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
1f190 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1f1a0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1f1b0 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
1f1c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f1d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1f1e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1f1f0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1f200 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1f210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f220 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1f230 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap1", pDbFd->zPa
1f240 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  th);.      goto 
1f250 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1f260 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e   }..    if( sz<n
1f270 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Byte ){.      /*
1f280 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
1f290 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
1f2a0 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
1f2b0 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74  isWrite is set t
1f2c0 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c  o.      ** zero,
1f2d0 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
1f2e0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1f2f0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1f300 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
1f310 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
1f320 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
1f330 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
1f340 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63  zero, use ftrunc
1f350 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
1f360 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
1f370 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1f380 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  region..      */
1f390 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72  .      if( !isWr
1f3a0 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  ite ) goto shmpa
1f3b0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63  ge_out;.      rc
1f3c0 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1f3d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1f3e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1f3f0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
1f400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f410 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f420 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1f430 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
1f440 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
1f450 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1f470 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
1f480 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1f490 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1f4a0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1f4b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
1f4c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1f4d0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
1f4e0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1f4f0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
1f500 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
1f510 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1f520 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1f530 36 34 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  64(.        pShm
1f540 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28  Node->aRegion, (
1f550 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
1f560 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20  f(apNew[0]).    
1f570 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
1f580 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
1f590 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1f5a0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
1f5b0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1f5c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
1f5d0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
1f5e0 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
1f5f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1f600 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
1f610 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
1f620 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
1f630 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
1f640 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
1f650 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
1f660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1f670 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
1f680 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53 51  egion */..#if SQ
1f690 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1f6a0 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1f6b0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
1f6c0 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  omApp(pShmNode->
1f6d0 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
1f6e0 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1f6f0 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20  ADWRITE, nByte, 
1f700 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1f710 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1f720 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1f730 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  E).      hMap = 
1f740 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1f750 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingW(pShmNode->h
1f760 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
1f770 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1f780 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1f790 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1f7a0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1f7b0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1f7c0 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57  NSI) && SQLITE_W
1f7d0 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d  IN32_CREATEFILEM
1f7e0 41 50 50 49 4e 47 41 0a 20 20 20 20 20 20 68 4d  APPINGA.      hM
1f7f0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1f800 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f  eMappingA(pShmNo
1f810 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
1f820 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1f830 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
1f840 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1f850 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
1f860 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1f870 4d 41 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25  MAP-CREATE pid=%
1f880 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73  lu, region=%d, s
1f890 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ize=%d, rc=%s\n"
1f8a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f8b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f8c0 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
1f8d0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79  de->nRegion, nBy
1f8e0 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
1f8f0 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     hMap ? "ok" :
1f900 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1f910 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
1f920 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
1f930 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  et = pShmNode->n
1f940 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
1f950 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
1f960 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
1f970 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
1f980 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1f990 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51  nularity;.#if SQ
1f9a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1f9b0 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
1f9c0 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
1f9d0 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  App(hMap, FILE_M
1f9e0 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
1f9f0 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
1fa00 20 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20        iOffset - 
1fa10 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1fa20 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1fa30 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1fa40 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70  .#else.        p
1fa50 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  Map = osMapViewO
1fa60 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45  fFile(hMap, FILE
1fa70 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
1fa80 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
1fa90 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73          0, iOffs
1faa0 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
1fab0 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
1fac0 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
1fad0 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20     );.#endif.   
1fae0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1faf0 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25  HM-MAP-MAP pid=%
1fb00 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f  lu, region=%d, o
1fb10 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
1fb20 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1fb40 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1fb50 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
1fb60 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
1fb70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1fb80 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d      szRegion, pM
1fb90 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1fba0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
1fbb0 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
1fbc0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
1fbd0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
1fbe0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1fbf0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1fc00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1fc10 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
1fc20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
1fc30 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fc50 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62  winShmMap3", pDb
1fc60 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1fc70 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f      if( hMap ) o
1fc80 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61  sCloseHandle(hMa
1fc90 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  p);.        goto
1fca0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1fcb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68      }..      pSh
1fcc0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
1fcd0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1fce0 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20  ].pMap = pMap;. 
1fcf0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
1fd00 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
1fd10 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d  >nRegion].hMap =
1fd20 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   hMap;.      pSh
1fd30 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b  mNode->nRegion++
1fd40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
1fd50 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
1fd60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1fd70 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
1fd80 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69   int iOffset = i
1fd90 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
1fda0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
1fdb0 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
1fdc0 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
1fdd0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1fde0 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a  rity;.    char *
1fdf0 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d  p = (char *)pShm
1fe00 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52  Node->aRegion[iR
1fe10 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20  egion].pMap;.   
1fe20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26   *pp = (void *)&
1fe30 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b  p[iOffsetShift];
1fe40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
1fe50 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  p = 0;.  }.  sql
1fe60 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1fe70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1fe80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1fe90 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  }..#else.# defin
1fea0 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20  e winShmMap     
1feb0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1fec0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
1fed0 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65  ine winShmBarrie
1fee0 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  r 0.# define win
1fef0 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
1ff00 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
1ff10 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
1ff20 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20  /../*.** Cleans 
1ff30 75 70 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  up the mapped re
1ff40 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63  gion of the spec
1ff50 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61  ified file, if a
1ff60 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ny..*/.#if SQLIT
1ff70 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1ff80 30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  0.static int win
1ff90 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
1ffa0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
1ffb0 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
1ffc0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d  .  OSTRACE(("UNM
1ffd0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1ffe0 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1fff0 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25  %p, pMapRegion=%
20000 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  p, ".           
20010 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20  "mmapSize=%lld, 
20020 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25  mmapSizeActual=%
20030 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78  lld, mmapSizeMax
20040 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
20050 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20060 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
20070 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70  ile, pFile->hMap
20080 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
20090 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
200a0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c  pFile->mmapSize,
200b0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
200c0 41 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d  Actual, pFile->m
200d0 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20  mapSizeMax));.  
200e0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
200f0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  egion ){.    if(
20100 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46   !osUnmapViewOfF
20110 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ile(pFile->pMapR
20120 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  egion) ){.      
20130 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
20140 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
20150 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
20160 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
20170 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20180 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
20190 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
201a0 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f     "rc=SQLITE_IO
201b0 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47  ERR_MMAP\n", osG
201c0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
201d0 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20  Id(), pFile,.   
201e0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
201f0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b  e->pMapRegion));
20200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
20210 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
20220 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
20230 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61          "winUnma
20260 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e  pfile1", pFile->
20270 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
20280 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
20290 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ion = 0;.    pFi
202a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
202b0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
202c0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
202d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
202e0 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap!=NULL ){.
202f0 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65      if( !osClose
20300 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
20310 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ap) ){.      pFi
20320 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
20330 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
20340 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
20350 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
20360 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20370 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49  hMap=%p, rc=SQLI
20380 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
20390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
203a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
203b0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
203c0 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a   pFile->hMap));.
203d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
203e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
203f0 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c  IOERR_MMAP, pFil
20400 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70         "winUnmap
20430 66 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  file2", pFile->z
20440 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
20450 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
20460 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ULL;.  }.  OSTRA
20470 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
20480 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20490 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
204a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
204b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
204c0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b  ssId(), pFile));
204d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
204e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  _OK;.}../*.** Me
204f0 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
20500 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
20510 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
20520 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
20530 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
20540 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
20550 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
20560 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
20570 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
20580 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
20590 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
205a0 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
205b0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
205c0 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e  still.** outstan
205d0 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65  ding xFetch() re
205e0 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20  ferences to it, 
205f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
20600 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
20610 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79  If parameter nBy
20620 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  te is non-negati
20630 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ve, then it is t
20640 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
20650 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70  e of.** the mapp
20660 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
20670 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
20680 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
20690 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
206a0 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
206b0 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
206c0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
206d0 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
206e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
206f0 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
20700 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
20710 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
20720 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
20730 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
20740 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
20750 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
20760 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
20770 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
20780 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
20790 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
207a0 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
207b0 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
207c0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
207d0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
207e0 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
207f0 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
20800 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
20810 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
20820 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
20830 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
20840 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
20850 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
20860 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
20870 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
20880 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
20890 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
208a0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
208b0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
208c0 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
208d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
208e0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
208f0 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
20900 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
20910 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
20920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20930 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
20940 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
20950 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
20960 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
20970 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
20980 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
20990 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
209a0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
209b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
209c0 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
209d0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
209e0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
209f0 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
20a00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
20a10 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
20a20 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
20a30 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
20a40 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
20a50 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
20a60 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
20a70 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
20a80 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
20a90 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e  e - 1);..  if( n
20aa0 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d  Map==0 && pFd->m
20ab0 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
20ac0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
20ad0 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  d);.  }.  if( nM
20ae0 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
20af0 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  e ){.    void *p
20b00 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f  New = 0;.    DWO
20b10 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47  RD protect = PAG
20b20 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
20b30 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49  DWORD flags = FI
20b40 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20  LE_MAP_READ;..  
20b50 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
20b60 46 64 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Fd);.#ifdef SQLI
20b70 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54  TE_MMAP_READWRIT
20b80 45 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e  E.    if( (pFd->
20b90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
20ba0 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
20bb0 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20  {.      protect 
20bc0 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  = PAGE_READWRITE
20bd0 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
20be0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b   FILE_MAP_WRITE;
20bf0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
20c00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
20c10 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  T.    pFd->hMap 
20c20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
20c30 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64  ppingFromApp(pFd
20c40 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
20c50 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b  ct, nMap, NULL);
20c60 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
20c70 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
20c80 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68  WIDE).    pFd->h
20c90 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
20ca0 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e  leMappingW(pFd->
20cb0 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
20cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
20cf0 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
20d00 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
20d30 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
20d40 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
20d50 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
20d60 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53  2_HAS_ANSI) && S
20d70 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41  QLITE_WIN32_CREA
20d80 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20  TEFILEMAPPINGA. 
20d90 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
20da0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
20db0 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngA(pFd->h, NULL
20dc0 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
20df0 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
20e00 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
20e30 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
20e40 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
20e50 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
20e60 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29  Fd->hMap==NULL )
20e70 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  {.      pFd->las
20e80 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
20e90 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
20ea0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
20eb0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
20ec0 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72  MAP, pFd->lastEr
20ed0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
20ef0 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e  Mapfile1", pFd->
20f00 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a  zPath);.      /*
20f10 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20   Log the error, 
20f20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72  but continue nor
20f30 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73  mal operation us
20f40 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
20f50 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
20f60 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45  E(("MAP-FILE-CRE
20f70 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
20f80 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
20f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20fa0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20fb0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
20fc0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
20fd0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
20fe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20ff0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 6e  }.    assert( (n
21000 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  Map % winSysInfo
21010 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  .dwPageSize)==0 
21020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
21030 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73  izeof(SIZE_T)==s
21040 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e  izeof(sqlite3_in
21050 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78  t64) || nMap<=0x
21060 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20  ffffffff );.#if 
21070 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
21080 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
21090 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
210a0 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  p(pFd->hMap, fla
210b0 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e  gs, 0, (SIZE_T)n
210c0 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Map);.#else.    
210d0 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
210e0 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70  OfFile(pFd->hMap
210f0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28  , flags, 0, 0, (
21100 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
21110 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65  ndif.    if( pNe
21120 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  w==NULL ){.     
21130 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
21140 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20  Fd->hMap);.     
21150 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c   pFd->hMap = NUL
21160 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61  L;.      pFd->la
21170 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
21180 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
21190 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
211a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
211b0 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
211c0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
211e0 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d  nMapfile2", pFd-
211f0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
21200 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
21210 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
21220 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
21230 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
21240 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
21250 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41  CE(("MAP-FILE-MA
21260 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
21270 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
21290 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
212a0 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
212b0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
212c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
212d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
212e0 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
212f0 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ion = pNew;.    
21300 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
21310 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  nMap;.    pFd->m
21320 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
21330 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  nMap;.  }..  OST
21340 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
21350 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
21360 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
21370 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
21380 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
21390 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
213a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
213b0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
213c0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
213d0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
213e0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
213f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
21400 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
21410 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
21420 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
21430 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
21440 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
21450 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
21460 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
21470 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
21480 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
21490 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
214a0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
214b0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
214c0 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
214d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
214e0 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
214f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
21500 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
21510 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
21520 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
21530 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
21540 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
21550 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
21560 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
21570 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
21580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
21590 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
215a0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
215b0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a  must eventually.
215c0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
215d0 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
215e0 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29  ing winUnfetch()
215f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21600 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33  winFetch(sqlite3
21610 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
21620 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
21630 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
21640 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
21650 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20  IZE>0.  winFile 
21660 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  *pFd = (winFile*
21670 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
21680 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
21690 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
216a0 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f  .  *pp = 0;..  O
216b0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
216c0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
216d0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61  , offset=%lld, a
216e0 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c  mount=%d, pp=%p\
216f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
21700 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
21710 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66  ssId(), fd, iOff
21720 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23  , nAmt, pp));..#
21730 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
21740 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
21750 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
21760 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
21770 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
21780 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
21790 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
217a0 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
217b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
217c0 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  ){.        OSTRA
217d0 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
217e0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
217f0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
21800 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21810 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
21820 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
21830 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
21840 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21860 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
21870 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
21880 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
21890 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
218a0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
218b0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
218c0 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
218d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
218e0 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
218f0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
21900 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63  p=%p, *pp=%p, rc
21910 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
21920 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
21930 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
21940 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29  ), fd, pp, *pp))
21950 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21960 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
21970 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
21980 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
21990 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
219a0 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a  tion releases a.
219b0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
219c0 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
219d0 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46  ier call to winF
219e0 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
219f0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
21a00 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
21a10 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
21a20 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
21a30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
21a40 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
21a50 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
21a60 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63  winFetch() invoc
21a70 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ation..**.** Or,
21a80 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
21a90 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
21aa0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
21ab0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
21ac0 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  ed.** to inform 
21ad0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
21ae0 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
21af0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
21b00 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  ting mapping.** 
21b10 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
21b20 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
21b30 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
21b40 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
21b50 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
21b60 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
21b70 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
21b80 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
21b90 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
21ba0 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
21bb0 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
21bc0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
21bd0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
21be0 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
21bf0 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
21c00 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
21c10 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
21c20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
21c30 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
21c40 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
21c50 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
21c60 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
21c70 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
21c80 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
21c90 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
21ca0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
21cb0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
21cc0 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
21cd0 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
21ce0 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
21cf0 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
21d00 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
21d10 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
21d20 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
21d30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
21d40 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
21d50 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
21d60 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
21d70 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21d80 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
21d90 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
21da0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
21db0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
21dc0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
21dd0 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
21de0 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
21df0 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
21e00 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
21e10 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
21e20 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
21e30 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
21e40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
21e50 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
21e60 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
21e70 63 65 73 73 61 72 79 20 63 61 6e 20 62 65 20 6f  cessary can be o
21e80 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69  mitted - potenti
21e90 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20  ally improving. 
21ea0 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63     ** performanc
21eb0 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e  e.  */.    winUn
21ec0 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
21ed0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
21ee0 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
21ef0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
21f00 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
21f10 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
21f20 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
21f30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
21f40 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
21f50 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65  Id(), fd));.  re
21f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21f70 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
21f80 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
21f90 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
21fa0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
21fb0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
21fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
21fd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
21fe0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
21ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22000 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
22010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22050 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
22060 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
22070 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
22080 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
22090 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
220a0 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
220b0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
220c0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
220d0 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
220e0 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20  d = {.  3,      
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
22110 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
22120 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22130 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
22140 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c  se */.  winRead,
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
22170 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20   */.  winWrite, 
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
221a0 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  */.  winTruncate
221b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
221c0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
221d0 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20  e */.  winSync, 
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
22200 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  */.  winFileSize
22210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22220 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
22230 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20  e */.  winLock, 
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
22260 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20  */.  winUnlock, 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
22290 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73  */.  winCheckRes
222a0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
222b0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
222c0 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
222d0 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  winFileControl, 
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
22300 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  */.  winSectorSi
22310 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
22320 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
22330 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69  ize */.  winDevi
22340 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
22350 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76  s,       /* xDev
22360 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
22370 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61  cs */.  winShmMa
22380 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22390 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
223a0 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  ap */.  winShmLo
223b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
223c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
223d0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42  ock */.  winShmB
223e0 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
223f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
22400 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
22410 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22430 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77  xShmUnmap */.  w
22440 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  inFetch,        
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22460 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69  * xFetch */.  wi
22470 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20  nUnfetch        
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22490 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a   xUnfetch */.};.
224a0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
224b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
224c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
224d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
224e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
224f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
22510 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
22520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
22540 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
22550 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
22560 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
22570 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
22580 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
22590 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65  ject..*/..#if de
225a0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
225b0 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  )./*.** Convert 
225c0 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20  a filename from 
225d0 77 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64  whatever the und
225e0 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
225f0 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70  g system.** supp
22600 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d  orts for filenam
22610 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20  es into UTF-8.  
22620 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
22630 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f  e result is.** o
22640 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
22650 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
22660 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
22670 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
22680 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
22690 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
226a0 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f  ilename(const vo
226b0 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  id *zFilename){.
226c0 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74    char *zConvert
226d0 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73  ed = 0;.  if( os
226e0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  IsNT() ){.    zC
226f0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e  onverted = winUn
22700 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c  icodeToUtf8(zFil
22710 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
22720 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
22730 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
22740 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
22750 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
22760 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69  mbcs_to_utf8(zFi
22770 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  lename);.  }.#en
22780 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
22790 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
227a0 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
227b0 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
227c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
227d0 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
227e0 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
227f0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
22800 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
22810 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
22820 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
22830 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
22840 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
22850 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
22860 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
22870 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
22880 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
22890 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
228a0 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65  c void *winConve
228b0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
228c0 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
228d0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
228e0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
228f0 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  0;.  if( osIsNT(
22900 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
22910 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ted = winUtf8ToU
22920 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
22930 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
22940 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
22950 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
22960 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
22970 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
22980 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  to_mbcs(zFilenam
22990 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
229a0 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
229b0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
229c0 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
229d0 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
229e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
229f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
22a00 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
22a10 69 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69  ified UTF-8 stri
22a20 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64  ng buffer.** end
22a30 73 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f  s with a directo
22a40 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
22a50 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61  racter or one wa
22a60 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a  s successfully.*
22a70 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a  * added to it..*
22a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
22a90 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
22aa0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
22ab0 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75  zBuf){.  if( zBu
22ac0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  f ){.    int nLe
22ad0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
22ae0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69  n30(zBuf);.    i
22af0 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  f( nLen>0 ){.   
22b00 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53     if( winIsDirS
22b10 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29  ep(zBuf[nLen-1])
22b20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
22b30 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
22b40 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75  e if( nLen+1<nBu
22b50 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  f ){.        zBu
22b60 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74  f[nLen] = winGet
22b70 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20  DirSep();.      
22b80 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d    zBuf[nLen+1] =
22b90 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72   '\0';.        r
22ba0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
22bb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22bc0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22bd0 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
22be0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  ry file name and
22bf0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
22c00 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74  ting pointer int
22c10 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20  o pzBuf..** The 
22c20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
22c30 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62   in pzBuf must b
22c40 65 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69  e freed via sqli
22c50 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
22c60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
22c70 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33  Tempname(sqlite3
22c80 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72  _vfs *pVfs, char
22c90 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61   **pzBuf){.  sta
22ca0 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b  tic char zChars[
22cb0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
22cc0 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
22cd0 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
22ce0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
22cf0 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
22d00 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74  56789";.  size_t
22d10 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72   i, j;.  int nPr
22d20 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
22d30 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  n30(SQLITE_TEMP_
22d40 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20  FILE_PREFIX);.  
22d50 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20  int nMax, nBuf, 
22d60 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68  nDir, nLen;.  ch
22d70 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20  ar *zBuf;..  /* 
22d80 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
22d90 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
22da0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
22db0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
22dc0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
22dd0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
22de0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
22df0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
22e00 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
22e10 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20  tion failing..  
22e20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
22e30 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
22e40 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
22e50 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65  /* Allocate a te
22e60 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
22e70 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  o store the full
22e80 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
22e90 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74  .  ** name for t
22ea0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
22eb0 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c  e.  If this fail
22ec0 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  s, we cannot con
22ed0 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  tinue..  */.  nM
22ee0 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  ax = pVfs->mxPat
22ef0 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d  hname; nBuf = nM
22f00 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d  ax + 2;.  zBuf =
22f10 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
22f20 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66  ro( nBuf );.  if
22f30 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f  ( !zBuf ){.    O
22f40 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22f50 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22f60 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22f80 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22f90 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
22fa0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
22fb0 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72  effective tempor
22fc0 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
22fd0 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20  First, check if 
22fe0 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  one.  ** has bee
22ff0 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  n explicitly set
23000 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
23010 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ion; otherwise, 
23020 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a  use the one.  **
23030 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
23040 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
23050 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72  tem..  */.  nDir
23060 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20   = nMax - (nPre 
23070 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28  + 15);.  assert(
23080 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28   nDir>0 );.  if(
23090 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
230a0 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69  rectory ){.    i
230b0 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c  nt nDirLen = sql
230c0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
230d0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
230e0 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  ory);.    if( nD
230f0 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  irLen>0 ){.     
23100 20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65   if( !winIsDirSe
23110 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  p(sqlite3_temp_d
23120 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e  irectory[nDirLen
23130 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
23140 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20  nDirLen++;.     
23150 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69   }.      if( nDi
23160 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20  rLen>nDir ){.   
23170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23180 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
23190 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
231a0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
231b0 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
231c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
231d0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
231e0 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
231f0 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29  etTempname1", 0)
23200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23210 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23220 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
23230 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
23240 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
23250 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  }.  }.#if define
23260 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
23270 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
23280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
23290 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  irs[] = {.      
232a0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53   0, /* getenv("S
232b0 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a  QLITE_TMPDIR") *
232c0 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
232d0 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20  etenv("TMPDIR") 
232e0 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
232f0 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f  getenv("TMP") */
23300 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
23310 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a  tenv("TEMP") */.
23320 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
23330 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
23340 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76  ") */.       "/v
23350 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  ar/tmp",.       
23360 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
23370 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
23380 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20    ".",.       0 
23390 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
233a0 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20  erminator */.   
233b0 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   };.    unsigned
233c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
233d0 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
233e0 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  ;..    if( !azDi
233f0 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
23400 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
23410 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  TE_TMPDIR");.   
23420 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
23430 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
23440 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
23450 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
23460 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
23470 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a   getenv("TMP");.
23480 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
23490 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d  3] ) azDirs[3] =
234a0 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b   getenv("TEMP");
234b0 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
234c0 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20  [4] ) azDirs[4] 
234d0 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  = getenv("USERPR
234e0 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72  OFILE");.    for
234f0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
23500 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
23510 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
23520 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
23530 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72     void *zConver
23540 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ted;.      if( z
23550 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
23560 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e;.      /* If t
23570 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77  he path starts w
23580 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
23590 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  er followed by t
235a0 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a  he colon.      *
235b0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73  * character, ass
235c0 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64  ume it is alread
235d0 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  y a native Win32
235e0 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65   path; otherwise
235f0 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75  ,.      ** it mu
23600 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  st be converted 
23610 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  to a native Win3
23620 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43  2 path via the C
23630 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20  ygwin API.      
23640 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e  ** prior to usin
23650 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  g it..      */. 
23660 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72       if( winIsDr
23670 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
23680 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  n(zDir) ){.     
23690 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
236a0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
236b0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29  f8Filename(zDir)
236c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
236d0 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
236e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
236f0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
23700 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
23710 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23720 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23730 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
23740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23750 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
23760 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
23770 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
23780 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
23790 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
237a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
237b0 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44  , zBuf, "%s", zD
237c0 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ir);.          s
237d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
237e0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
237f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23800 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
23810 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
23820 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ted);.      }els
23830 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76  e{.        zConv
23840 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  erted = sqlite3M
23850 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b  allocZero( nMax+
23860 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
23870 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a   !zConverted ){.
23880 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23890 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
238a0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
238b0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
238c0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
238d0 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
238e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
238f0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
23900 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
23910 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67 77          if( cygw
23920 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20  in_conv_path(.  
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
23940 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
23950 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
23960 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
23970 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20  , zDir,.        
23980 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
23990 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b  ed, nMax+1)<0 ){
239a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
239b0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
239c0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ed);.          s
239d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
239e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
239f0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
23a00 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
23a10 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22  OERR_CONVPATH\n"
23a20 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
23a30 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
23a40 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  (SQLITE_IOERR_CO
23a50 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
23a60 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a80 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
23a90 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  me2", zDir);.   
23aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23ab0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
23ac0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
23ad0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
23ae0 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
23af0 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72  he candidate dir
23b00 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e  ectory exists an
23b10 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20  d should.       
23b20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20     ** be used.  
23b30 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20  However, we may 
23b40 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  need to convert 
23b50 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  the string conta
23b60 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  ining.          
23b70 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f  ** its name into
23b80 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20   UTF-8 (i.e. if 
23b90 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67  it is UTF-16 rig
23ba0 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20  ht now)..       
23bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
23bc0 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
23bd0 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
23be0 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65  lename(zConverte
23bf0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
23c00 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
23c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23c20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
23c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
23c40 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
23c50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53  ;.            OS
23c60 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
23c70 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
23c80 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
23c90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
23ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
23cb0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
23cc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
23ce0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
23cf0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
23d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23d10 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
23d20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23d30 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
23d40 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
23d50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
23d60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23d70 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
23d80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23d90 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f  .#elif !SQLITE_O
23da0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
23db0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
23dc0 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e    else if( osIsN
23dd0 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
23de0 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57  *zMulti;.    LPW
23df0 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20  STR zWidePath = 
23e00 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
23e10 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57  o( nMax*sizeof(W
23e20 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28  CHAR) );.    if(
23e30 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20   !zWidePath ){. 
23e40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23e50 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
23e60 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
23e70 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
23e80 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
23e90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23ea0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23eb0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
23ec0 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
23ed0 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64  PathW(nMax, zWid
23ee0 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  ePath)==0 ){.   
23ef0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23f00 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
23f10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23f20 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
23f30 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
23f40 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
23f50 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c  ERR_GETTEMPPATH\
23f60 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
23f70 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
23f80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
23f90 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  EMPPATH, osGetLa
23fa0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
23fd0 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d  ame2", 0);.    }
23fe0 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69  .    zMulti = wi
23ff0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
24000 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
24010 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
24020 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
24030 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
24040 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
24050 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24060 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  e(zMulti);.     
24070 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
24080 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65  idePath);.    }e
24090 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
240a0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
240b0 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
240c0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
240d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
240e0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
240f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24100 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
24110 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
24120 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
24130 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
24140 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
24150 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
24160 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20   char *zUtf8;.  
24170 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61 74    char *zMbcsPat
24180 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  h = sqlite3Mallo
24190 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20  cZero( nMax );. 
241a0 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61 74     if( !zMbcsPat
241b0 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  h ){.      sqlit
241c0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
241d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
241e0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
241f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24200 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
24210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
24220 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
24230 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47     }.    if( osG
24240 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78  etTempPathA(nMax
24250 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20  , zMbcsPath)==0 
24260 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24270 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
24280 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
24290 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
242a0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
242b0 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
242c0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
242d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
242e0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
242f0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
24300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24310 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
24320 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29  etTempname3", 0)
24330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
24340 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  8 = sqlite3_win3
24350 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
24360 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69  MbcsPath);.    i
24370 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
24380 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
24390 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
243a0 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
243b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
243c0 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
243d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
243e0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
243f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
24400 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
24410 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
24420 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
24430 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
24440 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
24450 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
24460 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
24470 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66  S_ANSI */.#endif
24480 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   /* !SQLITE_OS_W
24490 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  INRT */..  /*.  
244a0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
244b0 20 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72   sure the tempor
244c0 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e  ary directory en
244d0 64 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f  ds with an appro
244e0 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61  priate.  ** sepa
244f0 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f  rator.  If it do
24500 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65  es not and there
24510 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73   is not enough s
24520 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64  pace left to add
24530 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e  .  ** one, fail.
24540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e  .  */.  if( !win
24550 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
24560 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b  nDir+1, zBuf) ){
24570 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24580 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
24590 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
245a0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
245b0 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
245c0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
245d0 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
245e0 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
245f0 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me4", 0);.  }.. 
24600 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74   /*.  ** Check t
24610 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
24620 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
24630 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
24640 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a  mporary file.  *
24650 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f  * name in the fo
24660 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a  llowing format:.
24670 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65    **.  **   "<te
24680 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
24690 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58  y>/etilqs_XXXXXX
246a0 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20  XXXXXXXXX\0\0". 
246b0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c   **.  ** If not,
246c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
246d0 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65  RROR.  The numbe
246e0 72 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72  r 17 is used her
246f0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  e in order to.  
24700 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  ** account for t
24710 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
24720 20 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65   the 15 characte
24730 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20  r random suffix 
24740 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  and the.  ** two
24750 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68   trailing NUL ch
24760 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66  aracters.  The f
24770 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73  inal directory s
24780 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
24790 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  er.  ** has alre
247a0 61 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20  ady added if it 
247b0 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  was not already 
247c0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  present..  */.  
247d0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
247e0 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
247f0 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65  if( (nLen + nPre
24800 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b   + 17) > nBuf ){
24810 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24820 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
24830 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
24840 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
24850 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
24860 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
24870 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
24880 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
24890 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me5", 0);.  }.. 
248a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
248b0 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20  f(nBuf-16-nLen, 
248c0 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54  zBuf+nLen, SQLIT
248d0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
248e0 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69  IX);..  j = sqli
248f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
24900 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
24910 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
24920 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
24930 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
24940 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
24950 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
24960 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
24970 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
24980 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
24990 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
249a0 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
249b0 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75  ;.  *pzBuf = zBu
249c0 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  f;..  OSTRACE(("
249d0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61  TEMP-FILENAME na
249e0 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
249f0 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a  _OK\n", zBuf));.
24a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24a10 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
24a20 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
24a30 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
24a40 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
24a50 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
24a60 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
24a70 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
24a80 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
24a90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
24aa0 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
24ab0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
24ac0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
24ad0 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
24ae0 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
24af0 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
24b00 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
24b10 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
24b20 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49  rrno;..  if( osI
24b30 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
24b40 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
24b50 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
24b60 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
24b70 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
24b80 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
24b90 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
24ba0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
24bb0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
24bc0 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
24bd0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
24c00 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
24c10 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
24c40 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
24c50 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
24c60 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20  ){}.    if( !rc 
24c70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24c80 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61  0; /* Invalid na
24c90 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  me? */.    }.   
24ca0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
24cb0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
24cc0 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  es;.#if SQLITE_O
24cd0 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
24ce0 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
24cf0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
24d00 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
24d10 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
24d20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74   }.  return (att
24d30 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
24d40 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
24d50 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
24d60 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a  UTE_DIRECTORY);.
24d70 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
24d80 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
24d90 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
24da0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
24db0 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ,        /* Used
24dc0 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20   to get maximum 
24dd0 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68  path name length
24de0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24df0 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
24e00 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
24e10 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
24e20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
24e30 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
24e40 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
24e50 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
24e60 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e80 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
24e90 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
24ea0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
24eb0 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
24ec0 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
24ed0 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
24ee0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
24ef0 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
24f00 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
24f10 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
24f20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
24f30 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
24f40 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
24f50 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
24f60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
24f70 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
24f80 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
24f90 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
24fa0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
24fb0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
24fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24fd0 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
24fe0 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
24ff0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
25000 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
25010 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
25020 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
25030 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
25040 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
25050 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
25060 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
25070 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
25080 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
25090 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
250a0 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
250b0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
250c0 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
250d0 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61  /.  char *zTmpna
250e0 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74  me = 0; /* For t
250f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
25100 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  e, if necessary.
25110 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
25120 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
25130 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
25140 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
25150 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
25160 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
25170 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
25180 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
25190 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
251a0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
251b0 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
251c0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
251d0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
251e0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
251f0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
25200 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
25210 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
25220 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
25230 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
25240 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
25250 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
25260 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
25270 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
25280 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
25290 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
252a0 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
252b0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
252c0 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
252d0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
252e0 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
252f0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
25300 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
25310 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
25320 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c  R_JOURNAL.     |
25330 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
25340 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
25350 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  L.     || eType=
25360 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
25370 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
25380 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
25390 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
253a0 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
253b0 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
253c0 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
253d0 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
253e0 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
253f0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
25400 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
25410 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a   are true:.  **.
25420 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
25430 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
25440 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
25450 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
25460 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
25470 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
25480 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
25490 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
254a0 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
254b0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
254c0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
254d0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
254e0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
254f0 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
25500 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
25510 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
25520 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
25530 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
25540 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
25550 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
25560 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
25570 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
25580 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
25590 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
255a0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
255b0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
255c0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
255d0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
255e0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
255f0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
25600 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
25610 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
25620 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
25630 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ever.  ** automa
25640 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
25650 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
25660 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
25670 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
25680 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
25690 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
256a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
256b0 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
256c0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
256d0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
256e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
256f0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
25700 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
25710 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
25720 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
25730 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
25740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
25750 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
25760 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
25770 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
25780 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
25790 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
257a0 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
257b0 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
257c0 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
257d0 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
257e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
257f0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
25800 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
25810 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  DB.       || eTy
25820 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
25830 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
25840 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25850 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a  EN_TEMP_JOURNAL.
25860 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
25870 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
25880 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
25890 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
258a0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20  MASTER_JOURNAL. 
258b0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
258c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
258d0 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
258e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
258f0 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
25900 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
25910 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
25920 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65  , sizeof(winFile
25930 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ));.  pFile->h =
25940 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
25950 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49  VALUE;..#if SQLI
25960 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
25970 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20  ( !zUtf8Name && 
25980 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  !sqlite3_temp_di
25990 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
259a0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
259b0 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20  E_ERROR,.       
259c0 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   "sqlite3_temp_d
259d0 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c  irectory variabl
259e0 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  e should be set 
259f0 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d  for WinRT");.  }
25a00 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
25a10 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25a20 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
25a30 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
25a40 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74  enerate a.  ** t
25a50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
25a60 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20  me to use.  */. 
25a70 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
25a80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
25a90 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
25aa0 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  enJournal );.   
25ab0 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
25ac0 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70  name(pVfs, &zTmp
25ad0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
25ae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25af0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
25b00 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
25b10 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  =%s", zUtf8Name,
25b20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
25b30 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
25b40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25b50 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
25b60 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
25b70 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
25b80 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
25b90 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
25ba0 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
25bb0 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
25bc0 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
25bd0 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
25be0 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
25bf0 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75  o.  ** sqlite3_u
25c00 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a  ri_parameter()..
25c10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
25c20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
25c30 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28  EN_MAIN_DB) || (
25c40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
25c50 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20  PEN_URI) ||.    
25c60 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c     zUtf8Name[sql
25c70 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74  ite3Strlen30(zUt
25c80 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  f8Name)+1]==0 );
25c90 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
25ca0 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
25cb0 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
25cc0 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
25cd0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
25ce0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
25cf0 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
25d00 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
25d10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
25d20 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
25d30 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
25d40 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
25d50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25d60 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  M", zUtf8Name));
25d70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25d80 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
25d90 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  KPT;.  }..  if( 
25da0 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
25db0 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ted) ){.    sqli
25dc0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
25dd0 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
25de0 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
25df0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
25e00 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
25e10 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
25e20 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61  _ISDIR", zUtf8Na
25e30 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
25e40 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
25e50 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ISDIR;.  }..  i
25e60 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
25e70 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
25e80 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
25e90 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
25ea0 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
25eb0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
25ec0 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
25ed0 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c  D;.  }..  /* SQL
25ee0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
25ef0 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  VE is used to ma
25f00 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e  ke sure that a n
25f10 65 77 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20  ew file is.  ** 
25f20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20  created. SQLite 
25f30 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74  doesn't use it t
25f40 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c  o indicate "excl
25f50 75 73 69 76 65 20 61 63 63 65 73 73 22 0a 20 20  usive access".  
25f60 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61  ** as it is usua
25f70 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a  lly understood..
25f80 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63    */.  if( isExc
25f90 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
25fa0 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66   Creates a new f
25fb0 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
25fc0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
25fd0 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f   exist. */.    /
25fe0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78  * If the file ex
25ff0 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20  ists, it fails. 
26000 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
26010 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43  nDisposition = C
26020 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c  REATE_NEW;.  }el
26030 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20  se if( isCreate 
26040 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65  ){.    /* Open e
26050 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72  xisting file, or
26060 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f   create if it do
26070 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20  esn't exist */. 
26080 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
26090 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
260a0 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
260b0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20  .    /* Opens a 
260c0 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
260d0 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
260e0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
260f0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49  ition = OPEN_EXI
26100 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77  STING;.  }..  dw
26110 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45  ShareMode = FILE
26120 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
26130 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a  LE_SHARE_WRITE;.
26140 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
26150 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
26160 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61  _WINCE.    dwFla
26170 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
26180 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
26190 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54  _HIDDEN;.    isT
261a0 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  emp = 1;.#else. 
261b0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
261c0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
261d0 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
261e0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55    | FILE_ATTRIBU
26210 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20  TE_HIDDEN.      
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26230 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
26240 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
26250 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  LOSE;.#endif.  }
26260 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67  else{.    dwFlag
26270 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
26280 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
26290 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
262a0 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68   Reports from th
262b0 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74  e internet are t
262c0 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  hat performance 
262d0 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62  is always.  ** b
262e0 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c  etter if FILE_FL
262f0 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
26300 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65   is used.  Ticke
26310 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20  t #2699. */.#if 
26320 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
26330 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
26340 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
26350 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
26360 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  S;.#endif..  if(
26370 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
26380 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
26390 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32  .    CREATEFILE2
263a0 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
263b0 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72  TERS extendedPar
263c0 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74  ameters;.    ext
263d0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
263e0 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  dwSize = sizeof(
263f0 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
26400 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
26410 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
26420 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41  rameters.dwFileA
26430 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20  ttributes =.    
26440 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
26450 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
26460 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
26470 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
26480 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
26490 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73  eFlags = dwFlags
264a0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
264b0 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a  FILE_FLAG_MASK;.
264c0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
264d0 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74  meters.dwSecurit
264e0 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55  yQosFlags = SECU
264f0 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a  RITY_ANONYMOUS;.
26500 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
26510 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74  meters.lpSecurit
26520 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55  yAttributes = NU
26530 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  LL;.    extended
26540 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70  Parameters.hTemp
26550 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  lateFile = NULL;
26560 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
26570 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28   osCreateFile2((
26580 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
26590 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265b0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
265c0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
26610 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
26620 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26640 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65   &extendedParame
26650 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  ters))==INVALID_
26660 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
26690 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
266a0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
266b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
266c0 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
266d0 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65  .#else.    while
266e0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
266f0 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ileW((LPCWSTR)zC
26700 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
26730 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
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 64 77 53 68 61 72 65 4d 6f         dwShareMo
26760 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26780 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
26790 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
267c0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
267d0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
26800 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
26810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
26830 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
26840 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
26850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26860 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
26870 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
26880 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
26890 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
268a0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  {.    while( (h 
268b0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28  = osCreateFileA(
268c0 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74  (LPCSTR)zConvert
268d0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
268e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268f0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
26900 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
26930 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26950 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
26960 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
26990 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269b0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
269c0 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
269d0 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
26a00 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
26a10 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
26a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
26a30 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  op */.    }.  }.
26a40 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49  #endif.  winLogI
26a50 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45  oerr(cnt, __LINE
26a60 5f 5f 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  __);..  OSTRACE(
26a70 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
26a80 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
26a90 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68  %lx, rc=%s\n", h
26aa0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20  , zUtf8Name,.   
26ab0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
26ac0 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56  dAccess, (h==INV
26ad0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
26ae0 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
26af0 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68  "ok"));..  if( h
26b00 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
26b10 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46  _VALUE ){.    pF
26b20 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
26b30 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
26b40 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
26b50 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69  TE_CANTOPEN, pFi
26b60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22  le->lastErrno, "
26b70 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e  winOpen", zUtf8N
26b80 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
26b90 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26ba0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
26bb0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
26bc0 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
26bd0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
26be0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ive ){.      ret
26bf0 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73  urn winOpen(pVfs
26c00 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20  , zName, id,.   
26c10 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
26c20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
26c30 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20  LY) &.          
26c40 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c             ~(SQL
26c50 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
26c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
26c70 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20  WRITE)),.       
26c80 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20    pOutFlags);.  
26c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
26ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
26cb0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
26cc0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
26cd0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
26ce0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
26cf0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
26d00 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
26d10 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
26d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
26d30 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
26d40 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
26d50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52     }.  }..  OSTR
26d60 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
26d70 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
26d80 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61  ess=%lx, pOutFla
26d90 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67  gs=%p, *pOutFlag
26da0 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  s=%d, ".        
26db0 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c     "rc=%s\n", h,
26dc0 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65   zUtf8Name, dwDe
26dd0 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75  siredAccess, pOu
26de0 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  tFlags, pOutFlag
26df0 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a  s ?.           *
26e00 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28  pOutFlags : 0, (
26e10 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
26e20 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
26e30 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23  ed" : "ok"));..#
26e40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
26e50 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
26e60 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
26e70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
26e80 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63  DB.       && (rc
26e90 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f   = winceCreateLo
26ea0 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29  ck(zName, pFile)
26eb0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )!=SQLITE_OK.  )
26ec0 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
26ed0 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  dle(h);.    sqli
26ee0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
26ef0 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
26f00 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
26f10 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
26f20 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d  OPEN-CE-LOCK nam
26f30 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
26f40 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  zName, sqlite3Er
26f50 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
26f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26f70 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
26f80 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
26f90 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
26fa0 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
26fb0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
26fc0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
26fd0 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
26fe0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
26ff0 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  pname);.  pFile-
27000 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
27010 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
27020 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
27030 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
27040 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
27050 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
27060 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
27070 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  LE_RDONLY;.  }. 
27080 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
27090 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
270a0 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
270b0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
270c0 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
270d0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
270e0 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
270f0 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
27100 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
27110 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
27120 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49   zName;.#if SQLI
27130 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27140 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  >0.  pFile->hMap
27150 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65   = NULL;.  pFile
27160 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
27170 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
27180 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ize = 0;.  pFile
27190 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
271a0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
271b0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c  mapSizeMax = sql
271c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
271d0 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a  .szMmap;.#endif.
271e0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
271f0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  1);.  return rc;
27200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
27210 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e   the named file.
27220 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
27230 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f   Windows does no
27240 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74  t allow a file t
27250 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20  o be deleted if 
27260 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
27270 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65  ocess has it ope
27280 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20  n.  Sometimes a 
27290 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72  virus scanner or
272a0 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61   indexing progra
272b0 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61  m.** will open a
272c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68   journal file sh
272d0 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69  ortly after it i
272e0 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64  s created in ord
272f0 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74  er to do.** what
27300 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57  ever it does.  W
27310 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20  hile this other 
27320 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
27330 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f  ng the.** file o
27340 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20  pen, we will be 
27350 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
27360 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72   it.  To work ar
27370 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f  ound this.** pro
27380 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31  blem, we delay 1
27390 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
273a0 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74  and try to delet
273b0 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20  e again.  Up.** 
273c0 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  to MX_DELETION_A
273d0 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e  TTEMPTs deletion
273e0 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75   attempts are ru
273f0 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a  n before giving.
27400 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ** up and return
27410 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
27420 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
27430 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
27440 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
27450 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
27460 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
27470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
27480 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
27490 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
274a0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79  lete */.  int sy
274b0 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20  ncDir           
274c0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
274d0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b  d on win32 */.){
274e0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
274f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
27500 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20  D attr;.  DWORD 
27510 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
27520 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
27530 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
27540 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
27550 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27560 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
27570 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
27580 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27590 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52  _DELETE);.  OSTR
275a0 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
275b0 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64  e=%s, syncDir=%d
275c0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
275d0 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43  syncDir));..  zC
275e0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
275f0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
27600 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
27610 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
27620 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
27630 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
27640 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
27650 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
27660 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
27670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27680 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
27690 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
276a0 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b  NT() ){.    do {
276b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
276c0 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32  INRT.      WIN32
276d0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
276e0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
276f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41        memset(&sA
27700 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
27710 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
27720 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74        if ( osGet
27730 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
27740 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65  W(zConverted, Ge
27750 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
27760 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27780 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
27790 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  a) ){.        at
277a0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
277b0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
277c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
277d0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
277e0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
277f0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
27800 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
27810 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
27820 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
27830 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
27840 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
27850 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27860 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
27870 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
27880 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
27890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
278a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
278b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
278c0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
278d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
278e0 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
278f0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
27900 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  W(zConverted);.#
27910 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28  endif.      if (
27920 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
27930 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
27940 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
27950 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
27960 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
27970 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
27980 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
27990 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
279a0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
279b0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
279c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
279d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
279e0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
279f0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
27a00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27a10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
27a20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
27a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
27a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
27a50 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
27a60 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
27a70 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
27a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
27a90 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
27aa0 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
27ab0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
27ac0 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
27ad0 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65  eFileW(zConverte
27ae0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
27af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
27b00 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
27b10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
27b30 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
27b40 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
27b50 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
27b60 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
27b70 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
27b80 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
27b90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27ba0 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
27bb0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
27bc0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
27bd0 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b    else{.    do {
27be0 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
27bf0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
27c00 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sA(zConverted);.
27c10 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d        if ( attr=
27c20 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
27c30 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20  TRIBUTES ){.    
27c40 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
27c50 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
27c60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
27c70 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
27c80 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
27c90 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
27ca0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
27cb0 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
27cc0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27cd0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
27ce0 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
27cf0 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
27d00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27d10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27d20 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
27d30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
27d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27d50 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54   ( attr&FILE_ATT
27d60 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
27d70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27d80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
27d90 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f  * Files only. */
27da0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
27db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27dc0 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41   ( osDeleteFileA
27dd0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
27de0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27df0 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74  ITE_OK; /* Delet
27e00 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20  ed OK. */.      
27e10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27e20 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e  .      if ( !win
27e30 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
27e40 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
27e50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27e60 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
27e70 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
27e80 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
27e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
27ea0 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e  hile(1);.  }.#en
27eb0 64 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20  dif.  if( rc && 
27ec0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
27ed0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b  _DELETE_NOENT ){
27ee0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
27ef0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
27f00 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45  RR_DELETE, lastE
27f10 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65  rrno, "winDelete
27f20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
27f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c   }else{.    winL
27f40 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c  ogIoerr(cnt, __L
27f50 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 73 71  INE__);.  }.  sq
27f60 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
27f70 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43  erted);.  OSTRAC
27f80 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
27f90 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46  %s, rc=%s\n", zF
27fa0 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
27fb0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
27fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27fd0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65  *.** Check the e
27fe0 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61  xistence and sta
27ff0 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tus of a file..*
28000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
28010 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
28020 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
28030 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
28040 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
28050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
28060 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
28070 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
28080 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
28090 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
280a0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
280b0 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
280c0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
280d0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
280e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
280f0 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44  Result */.){.  D
28100 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
28110 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
28120 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
28130 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
28140 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
28150 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
28160 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
28170 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
28180 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
28190 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43  .  OSTRACE(("ACC
281a0 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61  ESS name=%s, fla
281b0 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25  gs=%x, pResOut=%
281c0 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
281d0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67   zFilename, flag
281e0 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  s, pResOut));.. 
281f0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
28200 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
28210 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
28220 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
28230 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
28240 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
28250 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
28260 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
28270 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  n", zFilename));
28280 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28290 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
282a0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  KPT;.  }.  if( o
282b0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
282c0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
282d0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
282e0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
282f0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
28300 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
28310 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
28320 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
28330 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
28340 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
28350 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
28360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
28380 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
28390 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
283c0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
283d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
283e0 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
283f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
28400 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
28410 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
28420 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
28430 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
28440 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
28450 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
28460 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
28470 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
28480 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
28490 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
284a0 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
284b0 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  h==0.          &
284c0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
284d0 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
284e0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
284f0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
28500 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
28510 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
28520 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
28530 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
28540 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28550 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f  {.      winLogIo
28560 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
28570 5f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  _);.      if( la
28580 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46  stErrno!=ERROR_F
28590 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26  ILE_NOT_FOUND &&
285a0 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
285b0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
285c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
285d0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
285e0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
285f0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
28600 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
28610 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  CESS, lastErrno,
28620 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20   "winAccess",.  
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28640 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
28650 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
28660 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
28670 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
28680 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
28690 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
286a0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
286b0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
286c0 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
286d0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
286e0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
286f0 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
28700 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28710 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
28720 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
28730 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
28740 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
28750 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
28760 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
28770 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
28780 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
28790 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
287a0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
287b0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
287c0 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TE:.      rc = a
287d0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
287e0 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74               (at
28800 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
28810 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  UTE_READONLY)==0
28820 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
28830 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
28840 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
28850 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
28860 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
28870 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
28880 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
28890 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%s, pResOut=%p
288a0 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
288b0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
288c0 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
288d0 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a  name, pResOut, *
288e0 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
288f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28900 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
28910 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
28920 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
28930 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
28940 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a  a drive letter.*
28950 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  * followed by a 
28960 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e  colon character.
28970 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
28980 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
28990 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73  AndColon(.  cons
289a0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
289b0 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20  e.){.  return ( 
289c0 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
289d0 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20  Pathname[0]) && 
289e0 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a  zPathname[1]==':
289f0 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ' );.}../*.** Re
28a00 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
28a10 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
28a20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
28a30 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69   be used verbati
28a40 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65  m.  If.** non-ze
28a50 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  ro is returned f
28a60 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
28a70 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  n, the calling f
28a80 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d  unction must sim
28a90 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70  ply.** use the p
28aa0 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d  rovided path nam
28ab0 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20  e verbatim -OR- 
28ac0 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20  resolve it into 
28ad0 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  a full path name
28ae0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65  .** using the Ge
28af0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69  tFullPathName Wi
28b00 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  n32 API function
28b10 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e   (if available).
28b20 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
28b30 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
28b40 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  hname(.  const c
28b50 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
28b60 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  {.  /*.  ** If t
28b70 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
28b80 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61  rts with a forwa
28b90 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61  rd slash or a ba
28ba0 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65  ckslash, it is e
28bb0 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67  ither.  ** a leg
28bc0 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76  al UNC name, a v
28bd0 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70  olume relative p
28be0 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c  ath, or an absol
28bf0 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e  ute path name in
28c00 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22   the.  ** "Unix"
28c10 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f   format on Windo
28c20 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ws.  There is no
28c30 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66   easy way to dif
28c40 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
28c50 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  en.  ** the fina
28c60 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65  l two cases; the
28c70 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72  refore, we retur
28c80 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75  n the safer retu
28c90 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45  rn value of TRUE
28ca0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61  .  ** so that ca
28cb0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
28cc0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70  nction will simp
28cd0 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74  ly use it verbat
28ce0 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  im..  */.  if ( 
28cf0 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74  winIsDirSep(zPat
28d00 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  hname[0]) ){.   
28d10 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
28d20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
28d30 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
28d40 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74  arts with a lett
28d50 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69  er and a colon i
28d60 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f  t is either a vo
28d70 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69  lume.  ** relati
28d80 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62  ve path or an ab
28d90 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61  solute path.  Ca
28da0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
28db0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a  nction must not.
28dc0 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    ** attempt to 
28dd0 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65  treat it as a re
28de0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
28df0 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75   (i.e. they shou
28e00 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20  ld simply use.  
28e10 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e  ** it verbatim).
28e20 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e  .  */.  if ( win
28e30 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
28e40 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29  Colon(zPathname)
28e50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
28e60 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
28e70 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   ** If we get to
28e80 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
28e90 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
28ea0 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  d almost certain
28eb0 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20  ly be a purely. 
28ec0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65   ** relative one
28ed0 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43   (i.e. not a UNC
28ee0 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c   name, not absol
28ef0 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c  ute, and not vol
28f00 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20  ume relative).. 
28f10 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c   */.  return FAL
28f20 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  SE;.}../*.** Tur
28f30 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
28f40 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
28f50 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
28f60 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
28f70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
28f80 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
28f90 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
28fa0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
28fb0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
28fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
28fd0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
28fe0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
28ff0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
29000 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
29010 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
29020 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
29030 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
29040 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
29050 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
29060 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29080 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
29090 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
290a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
290b0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
290c0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
290d0 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20  ffer */.){..#if 
290e0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
290f0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
29100 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
29110 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
29120 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29130 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72  (nFull);.  asser
29140 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e  t( nFull>=pVfs->
29150 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
29160 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
29170 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
29180 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
29190 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
291a0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
291b0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
291c0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
291d0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
291e0 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
291f0 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
29200 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
29210 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
29220 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
29230 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
29240 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
29250 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
29260 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
29270 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
29280 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
29290 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
292a0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61  ectory and a sla
292b0 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  sh..    */.    c
292c0 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
292d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
292e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
292f0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
29300 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
29310 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29320 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
29330 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
29340 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
29350 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
29360 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
29370 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
29380 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20  IX_TO_WIN_A) |. 
29390 20 20 20 20 20 20 20 20 20 20 20 43 43 50 5f 52             CCP_R
293a0 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69  ELATIVE, zRelati
293b0 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e  ve, zOut, pVfs->
293c0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
293d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
293e0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
293f0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
29400 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
29410 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
29420 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29440 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
29450 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61  athname1", zRela
29460 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tive);.    }else
29470 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
29480 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
29490 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
294a0 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
294b0 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
294c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
294d0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
294e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
294f0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
29500 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
29510 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
29520 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
29530 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
29540 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29560 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
29570 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
29580 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38  tDirSep(), zUtf8
29590 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
295a0 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
295b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
295c0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
295d0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
295e0 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zOut = sqlite3M
295f0 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d  allocZero( pVfs-
29600 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b  >mxPathname+1 );
29610 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
29620 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
29630 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
29640 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
29650 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
29660 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
29670 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20      (osIsNT() ? 
29680 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
29690 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
296a0 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20  O_WIN_A),.      
296b0 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c        zRelative,
296c0 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50   zOut, pVfs->mxP
296d0 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a  athname+1)<0 ){.
296e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
296f0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
29700 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
29710 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
29720 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  EN_CONVPATH, (DW
29730 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29750 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
29760 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76  name2", zRelativ
29770 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
29780 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
29790 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
297a0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74  tf8Filename(zOut
297b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55  );.      if( !zU
297c0 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tf8 ){.        s
297d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
297e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
297f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29800 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
29810 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
29820 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
29830 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
29840 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
29850 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
29860 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29870 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
29880 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
29890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
298a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
298b0 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c  #endif..#if (SQL
298c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
298d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29  SQLITE_OS_WINRT)
298e0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
298f0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
29900 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
29910 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
29920 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61  );.  /* WinCE ha
29930 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20  s no concept of 
29940 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
29950 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20  ame, or so I am 
29960 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69  told. */.  /* Wi
29970 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74  nRT has no way t
29980 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61  o convert a rela
29990 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20  tive path to an 
299a0 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f  absolute one. */
299b0 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
299c0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
299d0 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
299e0 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
299f0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
29a00 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
29a10 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
29a20 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
29a30 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
29a40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
29a50 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
29a60 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
29a70 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
29a80 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
29a90 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
29aa0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
29ab0 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
29ac0 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
29ad0 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
29ae0 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
29af0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
29b00 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
29b10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
29b20 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
29b30 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
29b40 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
29b50 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
29b60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
29b70 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
29b80 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
29b90 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ), zRelative);. 
29ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
29bb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
29bc0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
29bd0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
29be0 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76  , "%s", zRelativ
29bf0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
29c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
29c10 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
29c20 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
29c30 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
29c40 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
29c50 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79  N__).  DWORD nBy
29c60 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
29c70 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
29c80 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
29c90 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
29ca0 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
29cb0 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
29cc0 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
29cd0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
29ce0 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
29cf0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
29d00 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
29d10 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
29d20 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69  ='/' && winIsDri
29d30 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
29d40 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b  (zRelative+1) ){
29d50 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
29d60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73  ;.  }..  /* It's
29d70 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
29d80 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
29d90 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
29da0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
29db0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
29dc0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
29dd0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
29de0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
29df0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
29e00 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
29e10 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
29e20 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
29e30 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
29e40 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
29e50 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
29e60 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
29e70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
29e80 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
29e90 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
29ea0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
29eb0 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
29ec0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
29ed0 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
29ee0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
29ef0 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
29f00 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
29f10 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
29f20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
29f30 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
29f40 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
29f50 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
29f60 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
29f70 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
29f80 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
29f90 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
29fa0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
29fb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
29fc0 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
29fd0 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
29fe0 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
29ff0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
2a000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2a010 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2a020 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2a030 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
2a060 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
2a070 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
2a080 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
2a090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2a0a0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
2a0b0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2a0c0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
2a0d0 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
2a0e0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
2a0f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a100 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2a110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
2a120 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53  NT() ){.    LPWS
2a130 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  TR zTemp;.    nB
2a140 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2a150 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
2a160 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  R)zConverted, 0,
2a170 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
2a180 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
2a190 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a1a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2a1b0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
2a1c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2a1d0 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
2a1e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2a1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a200 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
2a210 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
2a220 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
2a230 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
2a240 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
2a250 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
2a260 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
2a270 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
2a280 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
2a290 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2a2a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2a2b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a2c0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2a2d0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  T;.    }.    nBy
2a2e0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2a2f0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
2a300 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
2a310 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
2a320 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2a330 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a340 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2a350 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a360 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2a370 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2a380 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2a390 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2a3a0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2a3b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2a3d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20  FullPathname2", 
2a3e0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2a3f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2a400 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2a410 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
2a420 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
2a430 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
2a440 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  free(zTemp);.  }
2a450 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
2a460 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
2a470 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
2a480 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
2a490 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
2a4a0 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
2a4b0 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
2a4c0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
2a4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2a4e0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2a4f0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
2a500 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
2a510 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2a520 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
2a530 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2a560 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69  hname3", zRelati
2a570 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
2a580 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
2a590 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
2a5a0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
2a5b0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
2a5c0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
2a5d0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
2a5e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2a5f0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
2a600 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2a610 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2a620 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
2a630 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
2a640 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
2a650 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
2a660 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
2a670 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
2a680 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a690 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2a6a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a6b0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
2a6c0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
2a6d0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2a6e0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
2a6f0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a710 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2a720 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69  hname4", zRelati
2a730 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
2a740 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2a750 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
2a760 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
2a770 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
2a780 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
2a790 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2a7a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
2a7b0 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
2a7c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2a7d0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2a7e0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2a7f0 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
2a800 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a810 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
2a820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a830 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2a840 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
2a850 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  OMEM_BKPT;.  }.#
2a860 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66  endif.}..#ifndef
2a870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2a880 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
2a890 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
2a8a0 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
2a8b0 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
2a8c0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
2a8d0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
2a8e0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
2a8f0 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
2a900 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
2a910 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2a920 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  nDlOpen(sqlite3_
2a930 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
2a940 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2a950 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 23  ){.  HANDLE h;.#
2a960 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
2a970 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46 75  WIN__).  int nFu
2a980 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  ll = pVfs->mxPat
2a990 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72 20  hname+1;.  char 
2a9a0 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *zFull = sqlite3
2a9b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75 6c  MallocZero( nFul
2a9c0 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  l );.  void *zCo
2a9d0 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
2a9e0 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20  f( zFull==0 ){. 
2a9f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2aa00 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2aa10 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2aa20 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2aa30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2aa40 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 46 75 6c    }.  if( winFul
2aa50 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
2aa60 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
2aa70 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54 45  , zFull)!=SQLITE
2aa80 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2aa90 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a  e3_free(zFull);.
2aaa0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c      OSTRACE(("DL
2aab0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
2aac0 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
2aad0 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29  ename, (void*)0)
2aae0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2aaf0 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65  .  }.  zConverte
2ab00 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
2ab10 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
2ab20 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  Full);.  sqlite3
2ab30 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23 65  _free(zFull);.#e
2ab40 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  lse.  void *zCon
2ab50 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
2ab60 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
2ab70 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
2ab80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ab90 45 52 28 70 56 66 73 29 3b 0a 23 65 6e 64 69 66  ER(pVfs);.#endif
2aba0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
2abb0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
2abc0 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2abd0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2abe0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2abf0 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72  void*)0));.    r
2ac00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
2ac10 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
2ac20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2ac30 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  RT.    h = osLoa
2ac40 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
2ac50 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
2ac60 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a  rted, 0);.#else.
2ac70 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
2ac80 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29  braryW((LPCWSTR)
2ac90 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
2aca0 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
2acb0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2acc0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
2acd0 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61   h = osLoadLibra
2ace0 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  ryA((char*)zConv
2acf0 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
2ad00 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  if.  OSTRACE(("D
2ad10 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
2ad20 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
2ad30 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 68  lename, (void*)h
2ad40 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ));.  sqlite3_fr
2ad50 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2ad60 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
2ad70 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  h;.}.static void
2ad80 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69   winDlError(sqli
2ad90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2ada0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2adb0 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  BufOut){.  UNUSE
2adc0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2add0 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45  );.  winGetLastE
2ade0 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73  rrorMsg(osGetLas
2adf0 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20  tError(), nBuf, 
2ae00 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74  zBufOut);.}.stat
2ae10 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53  ic void (*winDlS
2ae20 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
2ae30 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f  pVfs,void *pH,co
2ae40 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29  nst char *zSym))
2ae50 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 50 52 4f  (void){.  FARPRO
2ae60 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45 44  C proc;.  UNUSED
2ae70 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2ae80 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47 65 74  ;.  proc = osGet
2ae90 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41  ProcAddressA((HA
2aea0 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a  NDLE)pH, zSym);.
2aeb0 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 53 59    OSTRACE(("DLSY
2aec0 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79 6d  M handle=%p, sym
2aed0 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73 73 3d  bol=%s, address=
2aee0 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
2aef0 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53 79    (void*)pH, zSy
2af00 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63 29 29  m, (void*)proc))
2af10 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
2af20 28 2a 29 28 76 6f 69 64 29 29 70 72 6f 63 3b 0a  (*)(void))proc;.
2af30 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
2af40 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
2af50 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
2af60 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
2af70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2af80 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69  Vfs);.  osFreeLi
2af90 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48  brary((HANDLE)pH
2afa0 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41 43  andle);.  OSTRAC
2afb0 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e 64  E(("DLCLOSE hand
2afc0 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64 2a  le=%p\n", (void*
2afd0 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65  )pHandle));.}.#e
2afe0 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45  lse /* if SQLITE
2aff0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2b000 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a  SION is defined:
2b010 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69   */.  #define wi
2b020 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65  nDlOpen  0.  #de
2b030 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20  fine winDlError 
2b040 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2b050 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
2b060 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a  ne winDlClose 0.
2b070 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 74 61 74 65  #endif../* State
2b080 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2b090 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
2b0a0 67 61 74 68 65 72 65 72 2e 20 2a 2f 0a 74 79 70  gatherer. */.typ
2b0b0 65 64 65 66 20 73 74 72 75 63 74 20 45 6e 74 72  edef struct Entr
2b0c0 6f 70 79 47 61 74 68 65 72 65 72 20 45 6e 74 72  opyGatherer Entr
2b0d0 6f 70 79 47 61 74 68 65 72 65 72 3b 0a 73 74 72  opyGatherer;.str
2b0e0 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65  uct EntropyGathe
2b0f0 72 65 72 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64  rer {.  unsigned
2b100 20 63 68 61 72 20 2a 61 3b 20 20 20 2f 2a 20 47   char *a;   /* G
2b110 61 74 68 65 72 20 65 6e 74 72 6f 70 79 20 69 6e  ather entropy in
2b120 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
2b130 2f 0a 20 20 69 6e 74 20 6e 61 3b 20 20 20 20 20  /.  int na;     
2b140 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2b150 6f 66 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20  of a[] in bytes 
2b160 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
2b170 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20           /* XOR 
2b180 6e 65 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20  next input into 
2b190 61 5b 69 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 58  a[i] */.  int nX
2b1a0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  or;           /*
2b1b0 20 4e 75 6d 62 65 72 20 6f 66 20 58 4f 52 20 6f   Number of XOR o
2b1c0 70 65 72 61 74 69 6f 6e 73 20 64 6f 6e 65 20 2a  perations done *
2b1d0 2f 0a 7d 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  /.};..#if !defin
2b1e0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
2b1f0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
2b200 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45  TE_OMIT_RANDOMNE
2b210 53 53 29 0a 2f 2a 20 4d 69 78 20 73 7a 20 62 79  SS)./* Mix sz by
2b220 74 65 73 20 6f 66 20 65 6e 74 72 6f 70 79 20 69  tes of entropy i
2b230 6e 74 6f 20 70 2e 20 2a 2f 0a 73 74 61 74 69 63  nto p. */.static
2b240 20 76 6f 69 64 20 78 6f 72 4d 65 6d 6f 72 79 28   void xorMemory(
2b250 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20  EntropyGatherer 
2b260 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  *p, unsigned cha
2b270 72 20 2a 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20  r *x, int sz){. 
2b280 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 66 6f 72   int j, k;.  for
2b290 28 6a 3d 30 2c 20 6b 3d 70 2d 3e 69 3b 20 6a 3c  (j=0, k=p->i; j<
2b2a0 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 2d  sz; j++){.    p-
2b2b0 3e 61 5b 6b 2b 2b 5d 20 5e 3d 20 78 5b 6a 5d 3b  >a[k++] ^= x[j];
2b2c0 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e  .    if( k>=p->n
2b2d0 61 20 29 20 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20  a ) k = 0;.  }. 
2b2e0 20 70 2d 3e 69 20 3d 20 6b 3b 0a 20 20 70 2d 3e   p->i = k;.  p->
2b2f0 6e 58 6f 72 20 2b 3d 20 73 7a 3b 0a 7d 0a 23 65  nXor += sz;.}.#e
2b300 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2b310 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
2b320 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2b330 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53  _OMIT_RANDOMNESS
2b340 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ) */../*.** Writ
2b350 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74  e up to nBuf byt
2b360 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73  es of randomness
2b370 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73   into zBuf..*/.s
2b380 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e  tatic int winRan
2b390 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
2b3a0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
2b3b0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2b3c0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
2b3d0 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2b3e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2b3f0 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20  T_RANDOMNESS).  
2b400 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b410 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74  (pVfs);.  memset
2b420 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
2b430 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
2b440 23 65 6c 73 65 0a 20 20 45 6e 74 72 6f 70 79 47  #else.  EntropyG
2b450 61 74 68 65 72 65 72 20 65 3b 0a 20 20 55 4e 55  atherer e;.  UNU
2b460 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2b470 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42  fs);.  memset(zB
2b480 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69  uf, 0, nBuf);.#i
2b490 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
2b4a0 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e  ER) && _MSC_VER>
2b4b0 3d 31 34 30 30 20 26 26 20 21 53 51 4c 49 54 45  =1400 && !SQLITE
2b4c0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 61 6e 64  _OS_WINCE.  rand
2b4d0 5f 73 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  _s((unsigned int
2b4e0 2a 29 7a 42 75 66 29 3b 20 2f 2a 20 72 61 6e 64  *)zBuf); /* rand
2b4f0 5f 73 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _s() is not avai
2b500 6c 61 62 6c 65 20 77 69 74 68 20 4d 69 6e 47 57  lable with MinGW
2b510 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65   */.#endif /* de
2b520 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20  fined(_MSC_VER) 
2b530 26 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 34 30  && _MSC_VER>=140
2b540 30 20 2a 2f 0a 20 20 65 2e 61 20 3d 20 28 75 6e  0 */.  e.a = (un
2b550 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
2b560 66 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e 42 75 66  f;.  e.na = nBuf
2b570 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d 20 30 3b 0a  ;.  e.nXor = 0;.
2b580 20 20 65 2e 69 20 3d 20 30 3b 0a 20 20 7b 0a 20    e.i = 0;.  {. 
2b590 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
2b5a0 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
2b5b0 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 78 6f  Time(&x);.    xo
2b5c0 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2b5d0 69 67 6e 65 64 20 63 68 61 72 2a 29 26 78 2c 20  igned char*)&x, 
2b5e0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
2b5f0 45 29 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20  E));.  }.  {.   
2b600 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
2b610 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
2b620 49 64 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  Id();.    xorMem
2b630 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2b640 64 20 63 68 61 72 2a 29 26 70 69 64 2c 20 73 69  d char*)&pid, si
2b650 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20 20  zeof(DWORD));.  
2b660 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  }.#if SQLITE_OS_
2b670 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 55 4c  WINRT.  {.    UL
2b680 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73  ONGLONG cnt = os
2b690 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29  GetTickCount64()
2b6a0 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2b6b0 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2b6c0 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66  ar*)&cnt, sizeof
2b6d0 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29 3b 0a 20 20  (ULONGLONG));.  
2b6e0 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20  }.#else.  {.    
2b6f0 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65  DWORD cnt = osGe
2b700 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20  tTickCount();.  
2b710 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2b720 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2b730 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 44 57 4f  &cnt, sizeof(DWO
2b740 52 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RD));.  }.#endif
2b750 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
2b760 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 4c  NRT */.  {.    L
2b770 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
2b780 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f      osQueryPerfo
2b790 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
2b7a0 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79  );.    xorMemory
2b7b0 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  (&e, (unsigned c
2b7c0 68 61 72 2a 29 26 69 2c 20 73 69 7a 65 6f 66 28  har*)&i, sizeof(
2b7d0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 29 3b  LARGE_INTEGER));
2b7e0 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45  .  }.#if !SQLITE
2b7f0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
2b800 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2b810 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53   SQLITE_WIN32_US
2b820 45 5f 55 55 49 44 0a 20 20 7b 0a 20 20 20 20 55  E_UUID.  {.    U
2b830 55 49 44 20 69 64 3b 0a 20 20 20 20 6d 65 6d 73  UID id;.    mems
2b840 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&id, 0, sizeo
2b850 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f 73  f(UUID));.    os
2b860 55 75 69 64 43 72 65 61 74 65 28 26 69 64 29 3b  UuidCreate(&id);
2b870 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2b880 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2b890 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66 28 55  r*)&id, sizeof(U
2b8a0 55 49 44 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  UID));.    memse
2b8b0 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&id, 0, sizeof
2b8c0 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f 73 55  (UUID));.    osU
2b8d0 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74  uidCreateSequent
2b8e0 69 61 6c 28 26 69 64 29 3b 0a 20 20 20 20 78 6f  ial(&id);.    xo
2b8f0 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2b900 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 64 2c  igned char*)&id,
2b910 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a   sizeof(UUID));.
2b920 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53    }.#endif /* !S
2b930 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
2b940 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
2b950 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
2b960 33 32 5f 55 53 45 5f 55 55 49 44 20 2a 2f 0a 20  32_USE_UUID */. 
2b970 20 72 65 74 75 72 6e 20 65 2e 6e 58 6f 72 3e 6e   return e.nXor>n
2b980 42 75 66 20 3f 20 6e 42 75 66 20 3a 20 65 2e 6e  Buf ? nBuf : e.n
2b990 58 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64  Xor;.#endif /* d
2b9a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2b9b0 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
2b9c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f  QLITE_OMIT_RANDO
2b9d0 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  MNESS) */.}.../*
2b9e0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
2b9f0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
2ba00 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
2ba10 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
2ba20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2ba30 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  nSleep(sqlite3_v
2ba40 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69  fs *pVfs, int mi
2ba50 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74  crosec){.  sqlit
2ba60 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28  e3_win32_sleep((
2ba70 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
2ba80 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
2ba90 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2baa0 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
2bab0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
2bac0 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
2bad0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
2bae0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
2baf0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
2bb00 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
2bb10 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
2bb20 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
2bb30 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
2bb40 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
2bb50 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
2bb60 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
2bb70 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
2bb80 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2bb90 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
2bba0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
2bbb0 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
2bbc0 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
2bbd0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
2bbe0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
2bbf0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
2bc00 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
2bc10 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
2bc20 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
2bc30 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
2bc40 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2bc50 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
2bc60 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
2bc70 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
2bc80 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
2bc90 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
2bca0 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
2bcb0 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
2bcc0 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
2bcd0 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
2bce0 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
2bcf0 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
2bd00 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
2bd10 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
2bd20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
2bd30 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
2bd40 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
2bd50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bd60 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2bd70 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
2bd80 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a 20 63  me and date.** c
2bd90 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
2bda0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2bdb0 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2bdc0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  4(sqlite3_vfs *p
2bdd0 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Vfs, sqlite3_int
2bde0 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a  64 *piNow){.  /*
2bdf0 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
2be00 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
2be10 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
2be20 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
2be30 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
2be40 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
2be50 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
2be60 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
2be70 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20 46 49  13.5)..  */.  FI
2be80 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61  LETIME ft;.  sta
2be90 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2bea0 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74  3_int64 winFilet
2beb0 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38  imeEpoch = 23058
2bec0 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  135*(sqlite3_int
2bed0 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64  64)8640000;.#ifd
2bee0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2bef0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2bf00 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
2bf10 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
2bf20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2bf30 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  8640000;.#endif.
2bf40 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61    /* 2^32 - to a
2bf50 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61  void use of LL a
2bf60 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67  nd warnings in g
2bf70 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  cc */.  static c
2bf80 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2bf90 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65  64 max32BitValue
2bfa0 20 3d 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65   =.      (sqlite
2bfb0 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
2bfc0 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
2bfd0 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
2bfe0 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  .      (sqlite3_
2bff0 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
2c000 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2c010 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
2c020 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74  ME time;.  osGet
2c030 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65  SystemTime(&time
2c040 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65  );.  /* if Syste
2c050 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
2c060 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75  ) fails, it retu
2c070 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  rns zero. */.  i
2c080 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65  f (!osSystemTime
2c090 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65  ToFileTime(&time
2c0a0 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75  ,&ft)){.    retu
2c0b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2c0c0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47  .  }.#else.  osG
2c0d0 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
2c0e0 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23  leTime( &ft );.#
2c0f0 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20  endif..  *piNow 
2c100 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  = winFiletimeEpo
2c110 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ch +.           
2c120 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   ((((sqlite3_int
2c130 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65  64)ft.dwHighDate
2c140 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61  Time)*max32BitVa
2c150 6c 75 65 29 20 2b 0a 20 20 20 20 20 20 20 20 20  lue) +.         
2c160 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
2c170 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
2c180 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
2c190 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
2c1a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2c1b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
2c1c0 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
2c1d0 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
2c1e0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2c1f0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2c200 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
2c210 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
2c220 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2c230 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
2c240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2c250 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2c260 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2c270 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2c280 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2c290 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
2c2a0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
2c2b0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
2c2c0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
2c2d0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
2c2e0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
2c2f0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
2c300 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2c310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c320 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28   winCurrentTime(
2c330 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2c340 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
2c350 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2c360 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
2c370 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e    rc = winCurren
2c380 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c  tTimeInt64(pVfs,
2c390 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20   &i);.  if( !rc 
2c3a0 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
2c3b0 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
2c3c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c3d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61  ../*.** The idea
2c3e0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
2c3f0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b  nction works lik
2c400 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  e a combination 
2c410 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  of.** GetLastErr
2c420 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d  or() and FormatM
2c430 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64  essage() on Wind
2c440 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e  ows (or errno an
2c450 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  d.** strerror_r(
2c460 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65  ) on Unix). Afte
2c470 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  r an error is re
2c480 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a  turned by an OS.
2c490 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c  ** function, SQL
2c4a0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2c4b0 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75  unction with zBu
2c4c0 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  f pointing to.**
2c4d0 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75   a buffer of nBu
2c4e0 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20  f bytes. The OS 
2c4f0 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70  layer should pop
2c500 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66  ulate the.** buf
2c510 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74  fer with a nul-t
2c520 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2c530 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65  encoded error me
2c540 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62  ssage.** describ
2c550 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20  ing the last IO 
2c560 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63  error to have oc
2c570 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68  curred within th
2c580 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72  e calling.** thr
2c590 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ead..**.** If th
2c5a0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2c5b0 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  is too large for
2c5c0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
2c5d0 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  ffer,.** it shou
2c5e0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e  ld be truncated.
2c5f0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2c600 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72  e of xGetLastErr
2c610 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  or.** is zero if
2c620 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2c630 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
2c640 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
2c650 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
2c660 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
2c670 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20  was truncated). 
2c680 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
2c690 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e  eturned,.** then
2c6a0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
2c6b0 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20  sary to include 
2c6c0 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
2c6d0 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  or character.** 
2c6e0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
2c6f0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  ffer..**.** Not 
2c700 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72  supplying an err
2c710 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
2c720 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20  have no adverse 
2c730 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c  effect.** on SQL
2c740 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20  ite. It is fine 
2c750 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65  to have an imple
2c760 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e  mentation that n
2c770 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ever.** returns 
2c780 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2c790 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47  :.**.**   int xG
2c7a0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2c7b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2c7c0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2c7d0 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73  Buf){.**     ass
2c7e0 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30  ert(zBuf[0]=='\0
2c7f0 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72  ');.**     retur
2c800 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  n 0;.**   }.**.*
2c810 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20  * However if an 
2c820 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2c830 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69   supplied, it wi
2c840 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74  ll be incorporat
2c850 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20  ed.** by sqlite 
2c860 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  into the error m
2c870 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65  essage available
2c880 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69   to the user usi
2c890 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72  ng.** sqlite3_er
2c8a0 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79  rmsg(), possibly
2c8b0 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72   making IO error
2c8c0 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75  s easier to debu
2c8d0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2c8e0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2c8f0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2c900 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
2c910 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 44 57 4f  ar *zBuf){.  DWO
2c920 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
2c930 45 72 72 6f 72 28 29 3b 0a 20 20 55 4e 55 53 45  Error();.  UNUSE
2c940 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2c950 29 3b 0a 20 20 69 66 28 20 6e 42 75 66 3e 30 20  );.  if( nBuf>0 
2c960 29 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  ) winGetLastErro
2c970 72 4d 73 67 28 65 2c 20 6e 42 75 66 2c 20 7a 42  rMsg(e, nBuf, zB
2c980 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 3b  uf);.  return e;
2c990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
2c9a0 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
2c9b0 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
2c9c0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2c9d0 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
2c9e0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
2c9f0 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
2ca00 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
2ca10 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca30 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2ca40 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2ca50 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2ca60 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2ca70 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
2ca80 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2ca90 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cab0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2cac0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
2cad0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2cae0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2caf0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
2cb00 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2cb10 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2cb20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2cb30 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2cb40 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2cb50 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2cb60 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2cb70 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2cb80 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2cb90 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2cba0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2cbb0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2cbc0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2cbd0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2cbe0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2cbf0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2cc00 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2cc10 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2cc20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2cc30 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2cc40 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2cc50 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2cc60 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2cc70 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2cc80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2cc90 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2cca0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2ccb0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2ccc0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2ccd0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
2cce0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2ccf0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2cd00 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
2cd10 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
2cd20 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
2cd30 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
2cd40 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2cd50 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2cd60 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
2cd70 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2cd80 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2cd90 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
2cda0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2cdb0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2cdc0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2cdd0 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  E).  static sqli
2cde0 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50  te3_vfs winLongP
2cdf0 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  athVfs = {.    3
2ce00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ce10 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2ce20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2ce30 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
2ce40 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2ce50 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
2ce60 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2ce70 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2ce80 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ce90 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
2cea0 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e  /.    "win32-lon
2ceb0 67 70 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e  gpath",    /* zN
2cec0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cee0 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2cef0 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2cf00 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2cf10 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2cf20 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2cf30 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
2cf40 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
2cf50 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2cf60 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2cf70 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
2cf80 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2cf90 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2cfa0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2cfb0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2cfc0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
2cfd0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
2cfe0 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
2cff0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2d000 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2d010 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2d020 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2d030 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2d040 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2d050 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2d060 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2d070 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
2d080 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
2d090 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
2d0a0 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
2d0b0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
2d0c0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2d0d0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2d0e0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
2d0f0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2d100 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2d110 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2d120 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
2d130 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
2d140 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2d150 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2d160 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2d170 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
2d180 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
2d190 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20  /.  };.#endif.. 
2d1a0 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b   /* Double-check
2d1b0 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61   that the aSysca
2d1c0 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62  ll[] array has b
2d1d0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  een constructed.
2d1e0 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
2d1f0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33   See ticket [bb3
2d200 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20  a86e890c8e96ab] 
2d210 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  */.  assert( Arr
2d220 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
2d230 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20 67 65  ==80 );..  /* ge
2d240 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
2d250 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
2d260 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
2d270 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
2d280 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
2d290 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  FO));.#if SQLITE
2d2a0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65  _OS_WINRT.  osGe
2d2b0 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
2d2c0 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
2d2d0 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
2d2e0 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
2d2f0 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nfo);.#endif.  a
2d300 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
2d310 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
2d320 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20  anularity>0 );. 
2d330 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
2d340 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30  nfo.dwPageSize>0
2d350 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   );..  sqlite3_v
2d360 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
2d370 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65  Vfs, 1);..#if de
2d380 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2d390 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
2d3a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
2d3b0 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68  ter(&winLongPath
2d3c0 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  Vfs, 0);.#endif.
2d3d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2d3e0 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  _OK;.}..int sqli
2d3f0 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
2d400 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
2d410 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
2d420 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj!=NULL ){.  
2d430 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
2d440 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
2d450 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
2d460 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2d470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d480 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2d490 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.