/ Hex Artifact Content
Login

Artifact c5651f7c0eef2b267cad643197cbad77811e4108:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0860: 4e 54 48 52 45 53 48 4f 4c 44 0a 23 20 20 64 65  NTHRESHOLD.#  de
0870: 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 54 48  fine NTDDI_WINTH
0880: 52 45 53 48 4f 4c 44 20 20 20 20 20 20 20 20 20  RESHOLD         
0890: 20 20 20 20 20 20 20 30 78 30 36 30 34 30 30 30         0x0604000
08a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
08b0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
08c0: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78  the GetVersionEx
08d0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61  [AW] functions a
08e0: 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f 6e  re deprecated on
08f0: 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 73   the.** target s
0900: 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73 69  ystem.  GetVersi
0910: 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20 64  onEx was first d
0920: 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69 6e  eprecated in Win
0930: 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  8.1..*/.#ifndef 
0940: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0950: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0960: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0970: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0980: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0990: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
09a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69   0   /* GetVersi
09d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63  onEx() is deprec
09e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a  ated */.#  else.
09f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0a00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
0a10: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47  IONEX   1   /* G
0a20: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73  etVersionEx() is
0a30: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65   current */.#  e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0a50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0a60: 69 66 20 74 68 65 20 43 72 65 61 74 65 46 69 6c  if the CreateFil
0a70: 65 4d 61 70 70 69 6e 67 41 20 66 75 6e 63 74 69  eMappingA functi
0a80: 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  on is supported 
0a90: 6f 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  on the.** target
0aa0: 20 73 79 73 74 65 6d 2e 20 20 49 74 20 69 73 20   system.  It is 
0ab0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  unavailable when
0ac0: 20 75 73 69 6e 67 20 22 6d 69 6e 63 6f 72 65 2e   using "mincore.
0ad0: 6c 69 62 22 20 6f 6e 20 57 69 6e 31 30 2e 0a 2a  lib" on Win10..*
0ae0: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0af0: 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 31 30 2c   for Windows 10,
0b00: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 22   always assume "
0b10: 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20 69 73 20  mincore.lib" is 
0b20: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  in use..*/.#ifnd
0b30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0b40: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0b50: 47 41 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  GA.#  if defined
0b60: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20  (NTDDI_VERSION) 
0b70: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  && NTDDI_VERSION
0b80: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 54 48 52   >= NTDDI_WINTHR
0b90: 45 53 48 4f 4c 44 0a 23 20 20 20 20 64 65 66 69  ESHOLD.#    defi
0ba0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0bb0: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0bc0: 47 41 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  GA   0.#  else.#
0bd0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0be0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
0bf0: 4c 45 4d 41 50 50 49 4e 47 41 20 20 20 31 0a 23  LEMAPPINGA   1.#
0c00: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0c20: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ant should alrea
0c30: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69  dy be defined (i
0c40: 6e 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22  n the "WinDef.h"
0c50: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23   SDK file)..*/.#
0c60: 69 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a  ifndef MAX_PATH.
0c70: 23 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  #  define MAX_PA
0c80: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
0c90: 20 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65          (260).#e
0ca0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0cb0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0cc0: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0cd0: 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20  or Win32.  This 
0ce0: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0cf0: 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a  be.** MAX_PATH..
0d00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0d10: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d20: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0d30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d40: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28  X_PATH_CHARS   (
0d50: 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66  MAX_PATH).#endif
0d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e  ../*.** This con
0d70: 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72  stant should alr
0d80: 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20  eady be defined 
0d90: 28 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68  (in the "WinNT.h
0da0: 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a  " SDK file)..*/.
0db0: 23 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f  #ifndef UNICODE_
0dc0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0dd0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f  .#  define UNICO
0de0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0df0: 41 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29  ARS      (32767)
0e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0e10: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0e20: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0e30: 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68  ) for WinNT.  Th
0e40: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0e50: 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45  ly be.** UNICODE
0e60: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0e70: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  S..*/.#ifndef SQ
0e80: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0e90: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0ea0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  ine SQLITE_WINNT
0eb0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0ec0: 20 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e    (UNICODE_STRIN
0ed0: 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e  G_MAX_CHARS).#en
0ee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0ef0: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0f00: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0f10: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0f20: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0f30: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0f40: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0f50: 20 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61   4 bytes per cha
0f60: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
0f70: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
0f80: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
0f90: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
0fa0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0fb0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0fc0: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0fd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0fe0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0ff0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
1000: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
1010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1020: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
1030: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
1040: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
1050: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1060: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f  y be.** UNICODE_
1070: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
1080: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
1090: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10a0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
10b0: 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69  TH_BYTES.#  defi
10c0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ne SQLITE_WINNT_
10d0: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20  MAX_PATH_BYTES  
10e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1100: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20  sizeof(WCHAR) * 
1110: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
1120: 5f 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e  _PATH_CHARS).#en
1130: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
1140: 75 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  um error message
1150: 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72   length (in char
1160: 73 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f  s) for WinRT..*/
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
1190: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
11a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
11b0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28  X_ERRMSG_CHARS (
11c0: 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  1024).#endif../*
11d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
11e0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72  zero if the char
11f0: 61 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20  acter should be 
1200: 74 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72  treated as a dir
1210: 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61  ectory.** separa
1220: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
1230: 77 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64  winIsDirSep.#  d
1240: 65 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65  efine winIsDirSe
1250: 70 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  p(a)            
1260: 20 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27      (((a) == '/'
1270: 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c  ) || ((a) == '\\
1280: 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ')).#endif../*.*
1290: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  * This macro is 
12a0: 75 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61  used when a loca
12b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  l variable is se
12c0: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61  t to a value tha
12d0: 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d  t is.** [sometim
12e0: 65 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  es] not used by 
12f0: 74 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76  the code (e.g. v
1300: 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  ia conditional c
1310: 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a  ompilation)..*/.
1320: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56  #ifndef UNUSED_V
1330: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20  ARIABLE_VALUE.# 
1340: 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56   define UNUSED_V
1350: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29  ARIABLE_VALUE(x)
1360: 20 20 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a        (void)(x).
1370: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1380: 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61 63  turns the charac
1390: 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ter that should 
13a0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 64  be used as the d
13b0: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
13c0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77  or..*/.#ifndef w
13d0: 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20 64  inGetDirSep.#  d
13e0: 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53  efine winGetDirS
13f0: 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ep()            
1400: 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a      '\\'.#endif.
1410: 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65  ./*.** Do we nee
1420: 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65  d to manually de
1430: 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66  fine the Win32 f
1440: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73  ile mapping APIs
1450: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41   for use with WA
1460: 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d  L.** mode or mem
1470: 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
1480: 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49   (e.g. these API
1490: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
14a0: 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a  in the Windows.*
14b0: 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  * CE SDK; howeve
14c0: 72 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  r, they are not 
14d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68  present in the h
14e0: 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a  eader file)?.*/.
14f0: 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  #if SQLITE_WIN32
1500: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
1510: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
1520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1530: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
1540: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1550: 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66  >0)./*.** Two of
1560: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e   the file mappin
1570: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65  g APIs are diffe
1580: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54  rent under WinRT
1590: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
15a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65  ich.** set we ne
15b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
15c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41  E_OS_WINRT.WINBA
15d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
15e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
15f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e  ppingFromApp(HAN
1600: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
1610: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
1620: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  UTES, ULONG, ULO
1630: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a  NG64, LPCWSTR);.
1640: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
1650: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
1660: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48  wOfFileFromApp(H
1670: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c  ANDLE, ULONG, UL
1680: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a  ONG64, SIZE_T);.
1690: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
16a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
16b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45  AS_ANSI).WINBASE
16c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
16d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
16e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingA(HANDLE, LPS
16f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1700: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1710: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1720: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64  D, LPCSTR);.#end
1730: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1750: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  NSI) */..#if def
1760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1770: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42  2_HAS_WIDE).WINB
1780: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1790: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
17a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20  appingW(HANDLE, 
17b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
17c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
17d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
17e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a  WORD, LPCWSTR);.
17f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1800: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1810: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e  AS_WIDE) */..WIN
1820: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
1830: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
1840: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52  ile(HANDLE, DWOR
1850: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1860: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66   SIZE_T);.#endif
1870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1880: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NRT */../*.** Th
1890: 65 73 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ese file mapping
18a0: 20 41 50 49 73 20 61 72 65 20 63 6f 6d 6d 6f 6e   APIs are common
18b0: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
18c0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 0a 57 49  nd WinRT..*/..WI
18d0: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
18e0: 4e 41 50 49 20 46 6c 75 73 68 56 69 65 77 4f 66  NAPI FlushViewOf
18f0: 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c 20 53 49  File(LPCVOID, SI
1900: 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53 45 41 50  ZE_T);.WINBASEAP
1910: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
1920: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
1930: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1940: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1950: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 2a  ILEMAPPING_API *
1960: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
1970: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
1980: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
1990: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
19a0: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ef INVALID_FILE_
19b0: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66  ATTRIBUTES.# def
19c0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  ine INVALID_FILE
19d0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57  _ATTRIBUTES ((DW
19e0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
19f0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
1a00: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
1a10: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
1a20: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
1a30: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
1a40: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
1a50: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
1a60: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
1a70: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
1a80: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
1a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
1ab0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1ac0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
1ad0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64  for WAL */.typed
1ae0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
1af0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20   winShm;        
1b00: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69     /* A connecti
1b10: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1b20: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1b40: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f   winShmNode;   /
1b50: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68  * A region of sh
1b60: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23  ared-memory */.#
1b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
1b80: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
1b90: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
1ba0: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
1bb0: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
1bc0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
1bd0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
1be0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1bf0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75  NCE.typedef stru
1c00: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20  ct winceLock {. 
1c10: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20   int nReaders;  
1c20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c30: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f  f reader locks o
1c40: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1c50: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  L bPending;     
1c60: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1c70: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
1c80: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1c90: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76  /.  BOOL bReserv
1ca0: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  ed;     /* Indic
1cb0: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20  ates a reserved 
1cc0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1cd0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
1ce0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20   bExclusive;    
1cf0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20  /* Indicates an 
1d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68  exclusive lock h
1d10: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1d20: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b   */.} winceLock;
1d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d40: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63  he winFile struc
1d50: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61  ture is a subcla
1d60: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1d70: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20  le* specific to 
1d80: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72  the win32.** por
1d90: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a  tability layer..
1da0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1db0: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c  t winFile winFil
1dc0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c  e;.struct winFil
1dd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  e {.  const sqli
1de0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1df0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75  pMethod; /*** Mu
1e00: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f  st be first ***/
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e20: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68  pVfs;      /* Th
1e30: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70  e VFS used to op
1e40: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  en this file */.
1e50: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20    HANDLE h;     
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1e70: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1e80: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
1e90: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  u8 locktype;    
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
1eb0: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
1ec0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
1ed0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73  ile */.  short s
1ee0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20  haredLockByte;  
1ef0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f   /* Randomly cho
1f00: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73  sen byte used as
1f10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a   a shared lock *
1f20: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73  /.  u8 ctrlFlags
1f30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
1f40: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49  lags.  See WINFI
1f50: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  LE_* below */.  
1f60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1f80: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1f90: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1fa0: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rror */.#ifndef 
1fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1fc0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20    winShm *pShm; 
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1fe0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20  tance of shared 
1ff0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66  memory on this f
2000: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
2010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2020: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
2030: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
2040: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
2050: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
2060: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
2070: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
2080: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
2090: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
20a0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
20b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
20c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
20d0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
20e0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
20f0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
2100: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
2110: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
2120: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
2130: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ock */.  HANDLE 
2140: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
2150: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
2160: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
2170: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
2180: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
2190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
21a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
21b0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
21c0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
21d0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
21e0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
21f0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
2200: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
2210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2220: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2230: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
2240: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
2270: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
2280: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
22b0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
22c0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
22d0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22f0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
2300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2310: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
2320: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
2330: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2340: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2350: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
2360: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c  ctual; /* Actual
2370: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2380: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2390: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
23a0: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e  zeMax;    /* Con
23b0: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
23c0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23d0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
23e0: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
23f0: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
2400: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
2410: 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  e WINFILE_RDONLY
2420: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 20 20            0x02  
2430: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
2440: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2450: 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50  define WINFILE_P
2460: 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30  ERSIST_WAL     0
2470: 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74  x04   /* Persist
2480: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2490: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
24a0: 50 53 4f 57 20 20 20 20 20 20 20 20 20 20 20 20  PSOW            
24b0: 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45  0x10   /* SQLITE
24c0: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
24d0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f  _OVERWRITE */../
24e0: 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *. * The size of
24f0: 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64   the buffer used
2500: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   by sqlite3_win3
2510: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e  2_write_debug().
2520: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2530: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
2540: 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  F_SIZE.#  define
2550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
2560: 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69  G_BUF_SIZE   ((i
2570: 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28  nt)(4096-sizeof(
2580: 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a  DWORD))).#endif.
2590: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
25a0: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
25b0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
25c0: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
25d0: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
25e0: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 73  data directory s
25f0: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2600: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2610: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
2620: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
2630: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2640: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
2650: 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65  TORY_TYPE (1).#e
2660: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2670: 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20  value used with 
2680: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
2690: 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f  t_directory() to
26a0: 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a   specify that. *
26b0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
26c0: 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20  irectory should 
26d0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a  be changed.. */.
26e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
26f0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
2700: 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69  ORY_TYPE.#  defi
2710: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2720: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
2730: 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a  YPE (2).#endif..
2740: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
2750: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
2760: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
2770: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
2780: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
2790: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
27a0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
27b0: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
27c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
27d0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f  _WIN32_MALLOC../
27e0: 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69 73 20  *. * If this is 
27f0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f  non-zero, an iso
2800: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2810: 62 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  be created by th
2820: 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20  e native Win32. 
2830: 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73  * allocator subs
2840: 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65  ystem; otherwise
2850: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72  , the default pr
2860: 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20  ocess heap will 
2870: 62 65 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20  be used.  This. 
2880: 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f  * setting has no
2890: 20 65 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d   effect when com
28a0: 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54  piling for WinRT
28b0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
28c0: 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20  his is enabled. 
28d0: 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65  * and an isolate
28e0: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
28f0: 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20  reated to store 
2900: 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61  all allocated da
2910: 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ta.. *. ********
2920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2960: 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e  ******. * WARNIN
2970: 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  G: It is importa
2980: 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20  nt to note that 
2990: 77 68 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e  when this settin
29a0: 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  g is non-zero an
29b0: 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  d the. *        
29c0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
29d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
29e0: 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65  led (e.g. by the
29f0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2a00: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20 66 75  n. *          fu
2a10: 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74  nction), all dat
2a20: 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63  a that was alloc
2a30: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ated using the i
2a40: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2a50: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20 62 65  l. *          be
2a60: 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65   freed immediate
2a70: 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d  ly and any attem
2a80: 70 74 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79  pt to access any
2a90: 20 6f 66 20 74 68 61 74 20 66 72 65 65 64 0a 20   of that freed. 
2aa0: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
2ab0: 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74  will almost cert
2ac0: 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ainly result in 
2ad0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63  an immediate acc
2ae0: 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20  ess violation.. 
2af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2b40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2b60: 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ATE.#  define SQ
2b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2b80: 43 52 45 41 54 45 20 20 20 20 28 54 52 55 45 29  CREATE    (TRUE)
2b90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2ba0: 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a  his is cache siz
2bb0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61  e used in the ca
2bc0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  lculation of the
2bd0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
2be0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70   the. * Win32-sp
2bf0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74  ecific heap.  It
2c00: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74   cannot be negat
2c10: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ive.. */.#ifndef
2c20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41   SQLITE_WIN32_CA
2c30: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53  CHE_SIZE.#  if S
2c40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
2c50: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20  CHE_SIZE>=0.#   
2c60: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2c70: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
2c80: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2c90: 43 41 43 48 45 5f 53 49 5a 45 29 0a 23 20 20 65  CACHE_SIZE).#  e
2ca0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
2cb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43  SQLITE_WIN32_CAC
2cc0: 48 45 5f 53 49 5a 45 20 28 2d 28 53 51 4c 49 54  HE_SIZE (-(SQLIT
2cd0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
2ce0: 53 49 5a 45 29 29 0a 23 20 20 65 6e 64 69 66 0a  SIZE)).#  endif.
2cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2d00: 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f  e initial size o
2d10: 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63  f the Win32-spec
2d20: 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73  ific heap.  This
2d30: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
2d40: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
2d50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2d60: 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64  P_INIT_SIZE.#  d
2d70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2d80: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
2d90: 45 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  E ((SQLITE_WIN32
2da0: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
2db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2de0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2df0: 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65  E) + 4194304).#e
2e00: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2e10: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
2e20: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
2e30: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
2e40: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
2e50: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2e60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2e70: 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  MAX_SIZE.#  defi
2e80: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2e90: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28  HEAP_MAX_SIZE  (
2ea0: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  0).#endif../*. *
2eb0: 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73   The extra flags
2ec0: 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73   to use in calls
2ed0: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65   to the Win32 he
2ee0: 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76  ap APIs.  This v
2ef0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a  alue may be. * z
2f00: 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61  ero for the defa
2f10: 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a  ult behavior.. *
2f20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2f40: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
2f50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
2f60: 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64  AGS     (0).#end
2f70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  if.../*.** The w
2f80: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
2f90: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
2fa0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
2fb0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
2fc0: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
2fd0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
2fe0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
2ff0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
3000: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
3010: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
3020: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
3030: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
3040: 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69  agic1;   /* Magi
3050: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
3060: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
3070: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
3080: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
3090: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
30a0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
30b0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
30c0: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
30d0: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
30e0: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
30f0: 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66  own)? */.#ifndef
3100: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
3110: 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63  gic2;   /* Magic
3120: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
3130: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
3140: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
3150: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
3160: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
3170: 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30  MEM_MAGIC1     0
3180: 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e  x42b2830b.#defin
3190: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  e WINMEM_MAGIC2 
31a0: 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 23      0xbd4d7cf4.#
31b0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
31c0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
31d0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
31e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
31f0: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c    WINMEM_MAGIC1,
3200: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
3210: 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44  FALSE.#ifndef ND
3220: 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d  EBUG.  ,WINMEM_M
3230: 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a  AGIC2.#endif.};.
3240: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3250: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
3260: 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 73  sertMagic1() ass
3270: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
3280: 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  a.magic1==WINMEM
3290: 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e  _MAGIC1 ).#defin
32a0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
32b0: 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 77  gic2() assert( w
32c0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
32d0: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
32e0: 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  2 ).#define winM
32f0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
3300: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
3310: 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73  ic1(); winMemAss
3320: 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c  ertMagic2();.#el
3330: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
3340: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
3350: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
3360: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
3370: 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  )  &win_mem_data
3380: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
3390: 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 6e  etHeap()     win
33a0: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
33b0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
33c0: 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f  tOwned()    win_
33d0: 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a  mem_data.bOwned.
33e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
33f0: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
3400: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
3410: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
3420: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
3430: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
3440: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
3450: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
3460: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
3470: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
3480: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
3490: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
34a0: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
34b0: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
34c0: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
34d0: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
34e0: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
34f0: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
3500: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3510: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
3520: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
3530: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
3540: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
3550: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3560: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
3570: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
3580: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
3590: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
35a0: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
35b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
35c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
35d0: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
35e0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
35f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3600: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
3610: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
3620: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
3630: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
3640: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
3650: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
3660: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
3670: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
3680: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
3690: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
36a0: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
36b0: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
36c0: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
36d0: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
36e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e   SQLITE_TEST.LON
36f0: 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56  G SQLITE_WIN32_V
3700: 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f  OLATILE sqlite3_
3710: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
3720: 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53  se.static LONG S
3730: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
3740: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
3750: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
3760: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
3770: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
3780: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
3790: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
37a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
37c0: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
37d0: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
37e0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
37f0: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
3800: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
3810: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
3820: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
3830: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
3840: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
3850: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
3860: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
3870: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
3880: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
3890: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
38a0: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
38b0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
38c0: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
38d0: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
38e0: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
38f0: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
3900: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
3910: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
3920: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
3930: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
3940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
3950: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
3960: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3980: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3990: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
39a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
39b0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
39c0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
39d0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
39e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
39f0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3a00: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3a10: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3a20: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
3a30: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3a40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
3a50: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
3a60: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
3a70: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
3a80: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
3a90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3aa0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
3ab0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
3ac0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ae0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3af0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3b00: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
3b10: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
3b20: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
3b30: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
3b40: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
3b50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3b60: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3b70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3b80: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
3b90: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
3ba0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3bb0: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
3bc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3bd0: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
3be0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3bf0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3c20: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
3c30: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
3c40: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
3c50: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3c60: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3c70: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3c90: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3ca0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3cc0: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3ce0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3cf0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
3d00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3d10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3d20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3d30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3d40: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
3d50: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
3d60: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
3d70: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3d80: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3da0: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
3db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3dc0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
3dd0: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
3de0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3df0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
3e00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3e10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3e20: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3e30: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
3e40: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3e50: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3e70: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3e80: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
3e90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ea0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3eb0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ec0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3ed0: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
3ee0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3ef0: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
3f00: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
3f10: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3f20: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
3f30: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
3f40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3f50: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3f60: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3f70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3f80: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
3f90: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3fa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3fb0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3fc0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3fd0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
3fe0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3ff0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4020: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
4030: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
4040: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
4050: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4060: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
4070: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
4080: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
4090: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
40a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
40b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
40c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
40d0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
40e0: 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69  \.        (!defi
40f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4100: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4110: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20  AX_MMAP_SIZE>0) 
4120: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
4130: 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45  ITE_WIN32_CREATE
4140: 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b  FILEMAPPINGA.  {
4150: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
4160: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
4170: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
4180: 61 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20  appingA,      0 
4190: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
41a0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
41b0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
41c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41f0: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
4200: 6e 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngA ((HANDLE(WIN
4210: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
4220: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
4230: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
4240: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4250: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4260: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [6].pCurrent)..#
4270: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4280: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
4290: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
42a0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
42b0: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
42c0: 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65 64         (!defined
42d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
42e0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
42f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20  MMAP_SIZE>0)).  
4300: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
4310: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
4320: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
4330: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
4340: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
4350: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4360: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4370: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4380: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4390: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
43a0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
43b0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
43c0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
43d0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
43e0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
43f0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4400: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
4410: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
4420: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4430: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4450: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
4460: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
4470: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4480: 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20  CreateMutexW,   
4490: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
44a0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  lse.  { "CreateM
44b0: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
44c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
44f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
4500: 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c  teMutexW ((HANDL
4510: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
4520: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
4530: 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20  ,BOOL, \.       
4540: 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61   LPCWSTR))aSysca
4550: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
4560: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4580: 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  SI).  { "DeleteF
4590: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
45a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
45b0: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
45c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
45d0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
45e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
45f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4620: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4630: 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leA ((BOOL(WINAP
4640: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4650: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
4660: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4670: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4680: 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74  WIDE).  { "Delet
4690: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
46a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
46b0: 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  leteFileW,      
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46d0: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
46e0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
46f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4720: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
4730: 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  FileW ((BOOL(WIN
4740: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4750: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
4760: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
4770: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
4780: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
4790: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
47a0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
47b0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
47c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
47d0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
47e0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
47f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4800: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4810: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
4820: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
4830: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
4840: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
4850: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
4860: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
4870: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
4880: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4890: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
48a0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
48b0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
48c0: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
48d0: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
48e0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
48f0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
4900: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4930: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
4940: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
4950: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
4960: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
4970: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
4980: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
4990: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
49a0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
49b0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
49c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
49d0: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
49e0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
49f0: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
4a00: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
4a10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
4a20: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
4a30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4a40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4a50: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
4a60: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
4a70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a80: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
4a90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4aa0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
4ab0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
4ac0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4af0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
4b00: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
4b10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
4b20: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
4b30: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
4b40: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
4b50: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
4b60: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
4b70: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4b80: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4b90: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
4ba0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
4bb0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4bc0: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
4bd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4be0: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4bf0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
4c00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4c30: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
4c40: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
4c50: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
4c60: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
4c70: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
4c80: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
4c90: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  *))aSyscall[15].
4ca0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4cb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4cc0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4cd0: 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  ON).  { "FreeLib
4ce0: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4cf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65     (SYSCALL)Free
4d00: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20  Library,        
4d10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4d20: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4d30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4d40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4d70: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
4d80: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
4d90: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
4da0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
4db0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
4dc0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
4dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4de0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4df0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4e00: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
4e10: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
4e20: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
4e30: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
4e40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
4e60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4e70: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4e80: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
4e90: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
4ea0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
4eb0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
4ec0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4ed0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ee0: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4ef0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4f20: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4f30: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
4f40: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,LPD
4f50: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
4f60: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4f70: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4f80: 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
4f90: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4fa0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4fb0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4fd0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4fe0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ff0: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
5000: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
5010: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
5020: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5030: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
5040: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5050: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5060: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5070: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5080: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
5090: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
50a0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
50b0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
50c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
50d0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
50e0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
50f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5100: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5110: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
5120: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
5130: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
5140: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
5150: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5160: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
5170: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
5180: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
51a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
51b0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
51c0: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
51d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
51e0: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
51f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5200: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5210: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5220: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5230: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5240: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
5250: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
5260: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
5270: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5280: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5290: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
52a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
52c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
52d0: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
52e0: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
52f0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
5300: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
5310: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5320: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5330: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
5340: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5350: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
5360: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
5370: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
5380: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5390: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
53a0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
53b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
53c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
53d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
53e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
53f0: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
5400: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
5410: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
5420: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
5430: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
5440: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
5450: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5460: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
5470: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
5480: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
5490: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
54a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
54b0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
54c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
54d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5500: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
5510: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
5520: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
5530: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
5540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5550: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5560: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
5570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5580: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
5590: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
55a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
55b0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
55c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
55d0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
55e0: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
55f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5620: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
5630: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
5640: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
5650: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
5660: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
5670: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
5680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5690: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
56a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
56b0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
56c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
56d0: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
56e0: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
56f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
5700: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
5710: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5720: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
5730: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
5740: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5770: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
5780: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
5790: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
57a0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
57b0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
57c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70  ))aSyscall[25].p
57d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
57e0: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
57f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5800: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
5810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5820: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
5830: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
5840: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5850: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
5860: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
5870: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5880: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5890: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
58a0: 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
58b0: 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
58c0: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
58d0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
58e0: 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22  ows CE. */.  { "
58f0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
5900: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
5910: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
5920: 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  sA,         0 },
5930: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
5940: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c  other Windows pl
5950: 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
5960: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
5970: 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
5980: 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61  ANSI string rega
5990: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
59a0: 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
59b0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
59c0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
59d0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
59e0: 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20  cAddress,       
59f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
5a00: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f  else.  { "GetPro
5a10: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5a20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5a50: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5a60: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
5a70: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
5a80: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
5a90: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
5aa0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
5ab0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5ac0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
5ad0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
5ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5af0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  GetSystemInfo,  
5b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b10: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
5b20: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
5b30: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5b60: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5b70: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
5b80: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
5b90: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
5ba0: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
5bb0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5bc0: 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ime",           
5bd0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
5be0: 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  emTime,         
5bf0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5c00: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20  osGetSystemTime 
5c10: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
5c20: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
5c30: 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72  yscall[29].pCurr
5c40: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5c50: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5c60: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5c70: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
5c80: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
5c90: 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  AsFileTime, 0 },
5ca0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
5cb0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5cc0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
5cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5ce0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5cf0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5d00: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5d10: 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  leTime ((VOID(WI
5d20: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5d30: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
5d40: 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72  yscall[30].pCurr
5d50: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5d60: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5d70: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
5d80: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
5d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5da0: 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20  )GetTempPathA,  
5db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5dc0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
5dd0: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5de0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5e10: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5e20: 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52  TempPathA ((DWOR
5e30: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5e40: 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c  ,LPSTR))aSyscall
5e50: 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [31].pCurrent)..
5e60: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5e70: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
5e80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5e90: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54  _WIDE).  { "GetT
5ea0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
5eb0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5ec0: 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20  etTempPathW,    
5ed0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5ee0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
5ef0: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5f00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5f40: 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28  mpPathW ((DWORD(
5f50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5f60: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
5f70: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
5f80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5f90: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
5fa0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
5fb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5fc0: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
5fd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5fe0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5ff0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
6000: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6030: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
6040: 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ount ((DWORD(WIN
6050: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
6060: 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e  call[33].pCurren
6070: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6080: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6090: 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45  _ANSI) && SQLITE
60a0: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
60b0: 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73  NEX.  { "GetVers
60c0: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
60d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56     (SYSCALL)GetV
60e0: 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20  ersionExA,      
60f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6100: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
6110: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
6120: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6150: 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69  efine osGetVersi
6160: 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e  onExA ((BOOL(WIN
6170: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6180: 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f   LPOSVERSIONINFO
6190: 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e  A))aSyscall[34].
61a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
61b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
61c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
61d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
61e0: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53  ) && \.        S
61f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
6200: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
6210: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
6220: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6230: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
6240: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6250: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
6260: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
6270: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
62a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
62b0: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
62c0: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
62d0: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
62e0: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
62f0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
6300: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
6330: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
6340: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6350: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
6360: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6370: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
6380: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6390: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
63a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
63b0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
63c0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
63d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
63e0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
63f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6400: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6410: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6420: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6450: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6460: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
6470: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
6480: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
6490: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
64a0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
64b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
64c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
64d0: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
64e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
64f0: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6500: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6510: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6520: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6530: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6560: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6570: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
6580: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
6590: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
65a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
65b0: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
65c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
65d0: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
65e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
65f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6600: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6610: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6620: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6630: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
6640: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
6650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6660: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
6670: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6680: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6690: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
66a0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
66b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
66c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
66d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
66e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
66f0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6710: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6730: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6740: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
6750: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6760: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6770: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6780: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
6790: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
67a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
67b0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
67d0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
67f0: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6800: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6810: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6840: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
6850: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
6860: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6870: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6880: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
6890: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
68c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
68d0: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
68e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
68f0: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6910: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6920: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6960: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6970: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
6980: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6990: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
69a0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
69b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
69c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
69d0: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
69e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
69f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6a00: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6a10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a20: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6a50: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
6a60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6aa0: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
6ab0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6ac0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
6ad0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
6ae0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6af0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6b00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6b10: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6b20: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6b30: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6b40: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6b50: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6b70: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
6b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6b90: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6ba0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
6bb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6be0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6bf0: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6c00: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6c10: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6c20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6c30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6c40: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
6c50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6c60: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
6c70: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
6c80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6c90: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6cb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6cd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6ce0: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
6cf0: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6d00: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6d10: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6d20: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6d30: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6d50: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6d60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6d70: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6da0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6de0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6df0: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6e00: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6e10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6e20: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6e30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6e40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6e50: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6e60: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6e70: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6e80: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6e90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ea0: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6eb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ec0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6ed0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6ee0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6f10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6f20: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6f30: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6f40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6f60: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6f70: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6f80: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6f90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6fa0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6fb0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6fc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6fd0: 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66   \.        (!def
6fe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ff0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7000: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
7010: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7020: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7030: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7040: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7050: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7060: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7070: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
7080: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
70a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
70b0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
70c0: 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  ile ((LPVOID(WIN
70d0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
70e0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
70f0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
7100: 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70  ))aSyscall[49].p
7110: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d  Current)..  { "M
7120: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
7130: 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ar",     (SYSCAL
7140: 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  L)MultiByteToWid
7150: 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a  eChar,     0 },.
7160: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69  .#define osMulti
7170: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28  ByteToWideChar (
7180: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
7190: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c  NT,DWORD,LPCSTR,
71a0: 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  int,LPWSTR, \.  
71b0: 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63        int))aSysc
71c0: 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74  all[50].pCurrent
71d0: 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72  )..  { "QueryPer
71e0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22  formanceCounter"
71f0: 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79  , (SYSCALL)Query
7200: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
7210: 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e  er, 0 },..#defin
7220: 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d  e osQueryPerform
7230: 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f  anceCounter ((BO
7240: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
7250: 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54         LARGE_INT
7260: 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  EGER*))aSyscall[
7270: 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  51].pCurrent).. 
7280: 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20   { "ReadFile",  
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
72a0: 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c  YSCALL)ReadFile,
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
72d0: 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ReadFile ((BOOL(
72e0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
72f0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  LPVOID,DWORD,LPD
7300: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7310: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7320: 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72  yscall[52].pCurr
7330: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e  ent)..  { "SetEn
7340: 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  dOfFile",       
7350: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7360: 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20  tEndOfFile,     
7370: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7380: 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46  fine osSetEndOfF
7390: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
73a0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
73b0: 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e  call[53].pCurren
73c0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
73d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
73e0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
73f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7400: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c  )SetFilePointer,
7410: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7420: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7430: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
7440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7470: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7480: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
7490: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
74a0: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
74b0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
74c0: 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43  )aSyscall[54].pC
74d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
74e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
74f0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7510: 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20  SCALL)Sleep,    
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7530: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
7540: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
7550: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7560: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7570: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7580: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7590: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
75a0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
75b0: 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72  Syscall[55].pCur
75c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
75d0: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
75e0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
75f0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7600: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
7610: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
7620: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
7630: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
7640: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
7650: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
7660: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
7670: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
7680: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7690: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
76a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f  _WINRT.  { "Unlo
76b0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
76c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
76d0: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
76e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
76f0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7700: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7710: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7740: 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63  .#ifndef osUnloc
7750: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
7760: 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  UnlockFile ((BOO
7770: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7780: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
7790: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
77a0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
77b0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
77c0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
77d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
77e0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
77f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7800: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
7810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7820: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
7830: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
7840: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7870: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
7880: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
7890: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
78a0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
78b0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
78c0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
78d0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
78e0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
78f0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66  OS_WINCE || !def
7900: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7910: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7920: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
7930: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7940: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7950: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7960: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7970: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7980: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
7990: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
79a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
79c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
79d0: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
79e0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
79f0: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
7a00: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
7a10: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
7a20: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
7a30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7a40: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7a50: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7a60: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7a70: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
7a80: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
7a90: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
7aa0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
7ab0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
7ac0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
7ad0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7ae0: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
7af0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7b00: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7b20: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
7b30: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7b40: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7b50: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7b60: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7b70: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7b80: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
7b90: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7ba0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7bb0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7bc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7bd0: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
7be0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7bf0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7c00: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
7c10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7c40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7c50: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7c60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7c70: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
7c80: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
7c90: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
7ca0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
7cb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7cc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7cd0: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7ce0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7cf0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7d00: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
7d10: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7d20: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7d30: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7d40: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7d60: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7d70: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7d80: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
7d90: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7da0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7db0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
7dc0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7dd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
7de0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7df0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7e00: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
7e10: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20  ingleObjectEx,  
7e20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7e30: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7e40: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
7e50: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7e70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7e80: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
7e90: 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52  eObjectEx ((DWOR
7ea0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7eb0: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
7ec0: 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c     BOOL))aSyscal
7ed0: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
7ee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7ef0: 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c  INRT.  { "SetFil
7f00: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
7f20: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20  FilePointerEx,  
7f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7f40: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7f50: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
7f60: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7f90: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
7fa0: 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c  PointerEx ((BOOL
7fb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7fc0: 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20  ,LARGE_INTEGER, 
7fd0: 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45  \.        PLARGE
7fe0: 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29  _INTEGER,DWORD))
7ff0: 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75  aSyscall[65].pCu
8000: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8010: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8020: 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  "GetFileInformat
8030: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20  ionByHandleEx", 
8040: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
8050: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
8060: 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73  dleEx, 0 },.#els
8070: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e  e.  { "GetFileIn
8080: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8090: 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  eEx", (SYSCALL)0
80a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
80c0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
80d0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
80e0: 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  ndleEx ((BOOL(WI
80f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
8100: 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e  .        FILE_IN
8110: 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41  FO_BY_HANDLE_CLA
8120: 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29  SS,LPVOID,DWORD)
8130: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
8140: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8150: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8160: 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  (!defined(SQLITE
8170: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
8180: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
8190: 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56 69  ZE>0).  { "MapVi
81a0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
81b0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
81c0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
81d0: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
81e0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
81f0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
8200: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8230: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
8240: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
8250: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
8260: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
8270: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
8280: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
8290: 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[67].pCurrent).
82a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
82b0: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
82c0: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
82d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
82e0: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
82f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8300: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
8310: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
8320: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8350: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
8360: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
8370: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
8380: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
8390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
83a0: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
83b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
83c0: 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72  Syscall[68].pCur
83d0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
83e0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
83f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8400: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
8410: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  N).  { "LoadPack
8420: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
8430: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
8440: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
8450: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8460: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
8470: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
8480: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
84b0: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
84c0: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
84d0: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
84e0: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
84f0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
8500: 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [69].pCurrent)..
8510: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8520: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
8530: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
8540: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
8550: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
8560: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8570: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
8580: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
8590: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
85c0: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
85d0: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
85e0: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
85f0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70  ))aSyscall[70].p
8600: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
8610: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
8620: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
8630: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
8640: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
8650: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
8660: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8670: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8680: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
8690: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
86a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
86b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
86c0: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
86d0: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
86e0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
86f0: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
8700: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
8710: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
8720: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8730: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
8740: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8750: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8760: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
8770: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
8780: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
8790: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
87a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
87b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
87c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
87d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
87e0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
87f0: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
8800: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
8810: 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[72].pCurrent)
8820: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
8830: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
8840: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
8850: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8860: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
8870: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
8880: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8890: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
88a0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
88b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
88e0: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
88f0: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
8900: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
8910: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33  STR))aSyscall[73
8920: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
8930: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
8940: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8950: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
8960: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
8970: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
8980: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
8990: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
89a0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34  OID))aSyscall[74
89b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
89c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
89d0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
89e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
89f0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
8a00: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43  P_SIZE>0).  { "C
8a10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8a20: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
8a30: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
8a40: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
8a50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
8a60: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8a70: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8a80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8a90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8aa0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8ab0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8ac0: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
8ad0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
8ae0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
8af0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
8b00: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
8b10: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
8b20: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
8b30: 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e  ../*.** NOTE: On
8b40: 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f   some sub-platfo
8b50: 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f  rms, the Interlo
8b60: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8b70: 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a  nge "function".*
8b80: 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c  *       is reall
8b90: 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74  y just a macro t
8ba0: 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69  hat uses a compi
8bb0: 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65  ler intrinsic (e
8bc0: 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20  .g. x64)..**    
8bd0: 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79     So do not try
8be0: 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73   to make this is
8bf0: 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61   into a redefina
8c00: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ble interface..*
8c10: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e  /.#if defined(In
8c20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8c30: 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49  Exchange).  { "I
8c40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8c50: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8c80: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8c90: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8ca0: 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65  hange Interlocke
8cb0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8cc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65  .#else.  { "Inte
8cd0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8ce0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
8cf0: 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  L)InterlockedCom
8d00: 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20  pareExchange, 0 
8d10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8d20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8d30: 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28  Exchange ((LONG(
8d40: 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a  WINAPI*)(LONG \.
8d50: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
8d60: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20  IN32_VOLATILE*, 
8d70: 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63  LONG,LONG))aSysc
8d80: 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74  all[76].pCurrent
8d90: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ).#endif /* defi
8da0: 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43  ned(InterlockedC
8db0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 20  ompareExchange) 
8dc0: 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
8dd0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
8de0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8df0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
8e00: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43  _UUID.  { "UuidC
8e10: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
8e20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
8e30: 75 69 64 43 72 65 61 74 65 2c 20 20 20 20 20 20  uidCreate,      
8e40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
8e50: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  e.  { "UuidCreat
8e60: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
8e70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8ea0: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72  #define osUuidCr
8eb0: 65 61 74 65 20 28 28 52 50 43 5f 53 54 41 54 55  eate ((RPC_STATU
8ec0: 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55  S(RPC_ENTRY*)(UU
8ed0: 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 37  ID*))aSyscall[77
8ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8ef0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
8f00: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
8f10: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
8f20: 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20  WIN32_USE_UUID. 
8f30: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65   { "UuidCreateSe
8f40: 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28  quential",     (
8f50: 53 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61  SYSCALL)UuidCrea
8f60: 74 65 53 65 71 75 65 6e 74 69 61 6c 2c 20 20 20  teSequential,   
8f70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8f80: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
8f90: 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53 43  tial",     (SYSC
8fa0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8fc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8fd0: 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
8fe0: 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20 20  uential \.      
8ff0: 20 20 28 28 52 50 43 5f 53 54 41 54 55 53 28 52    ((RPC_STATUS(R
9000: 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a  PC_ENTRY*)(UUID*
9010: 29 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70  ))aSyscall[78].p
9020: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
9030: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
9040: 5f 53 59 4e 43 29 20 26 26 20 53 51 4c 49 54 45  _SYNC) && SQLITE
9050: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
9060: 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f  .  { "FlushViewO
9070: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
9080: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 56   (SYSCALL)FlushV
9090: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
90a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
90b0: 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c   "FlushViewOfFil
90c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  e",          (SY
90d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
90f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
9100: 6e 65 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66  ne osFlushViewOf
9110: 46 69 6c 65 20 5c 0a 20 20 20 20 20 20 20 20 28  File \.        (
9120: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
9130: 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61  PCVOID,SIZE_T))a
9140: 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72  Syscall[79].pCur
9150: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
9160: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
9170: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
9180: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
9190: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
91a0: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
91b0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
91c0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
91d0: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
91e0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
91f0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
9200: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
9210: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
9220: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
9230: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
9240: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
9250: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
9260: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
9270: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
9280: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
9290: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
92a0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
92c0: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
92d0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
92e0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
92f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
9300: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
9310: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
9320: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
9330: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
9340: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
9350: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
9360: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9370: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
9380: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
9390: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
93a0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
93b0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
93c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
93d0: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
93e0: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
93f0: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
9400: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
9410: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
9420: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
9430: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
9440: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
9450: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
9460: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
9470: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
9480: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
9490: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
94a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
94b0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
94c0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
94d0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
94e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
94f0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
9500: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
9510: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
9520: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
9530: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
9540: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9550: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9560: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
9570: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
9580: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9590: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
95a0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
95b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
95c0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
95d0: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
95e0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
95f0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
9600: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9610: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
9620: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9630: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
9640: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
9650: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
9660: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
9670: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
9680: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
9690: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
96a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
96b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
96c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
96d0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
96e0: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
96f0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
9700: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
9710: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
9720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
9730: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
9740: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
9750: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
9760: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
9770: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
9780: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
9790: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
97a0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
97b0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
97c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
97d0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
97e0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
97f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9800: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
9810: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
9820: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9830: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9840: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
9850: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9860: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9870: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
9880: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
9890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
98a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
98b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
98c0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
98d0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
98e0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
98f0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9900: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9910: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9920: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9930: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9940: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9950: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
9960: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
9970: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9980: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
99a0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
99b0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
99c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
99d0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
99e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
99f0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9a00: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9a10: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9a20: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9a30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9a40: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9a50: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9a60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9a70: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9a80: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9a90: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
9aa0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
9ab0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9ac0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9ad0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9ae0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9af0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9b00: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9b10: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9b20: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9b30: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9b40: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9b50: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
9b60: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
9b70: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9b80: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9b90: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
9ba0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
9bb0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9bc0: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9bd0: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9be0: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9bf0: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9c00: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9c10: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
9c20: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
9c30: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
9c40: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
9c50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
9c60: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
9c70: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9c80: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
9c90: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
9ca0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
9cb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9cc0: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9cd0: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9ce0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9cf0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9d00: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9d10: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9d20: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9d30: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9d40: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9d50: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9d60: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9d80: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9d90: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9da0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9db0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9dc0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9dd0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9df0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9e00: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9e10: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
9e20: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
9e30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9e40: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
9e50: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
9e60: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9e70: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
9e80: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
9e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9ea0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9eb0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9ec0: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9ed0: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9f00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9f10: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
9f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9f30: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9f40: 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20  _ERROR, "failed 
9f50: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
9f60: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
9f90: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
9fa0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
9fb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9fc0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71  }.  }.#else.  sq
9fd0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9fe0: 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c  _NOTFOUND, "fail
9ff0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
a000: 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  t, heap=%p",.   
a010: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
a020: 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d  *)hHeap);.  rc =
a030: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
a040: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
a050: 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61  nLargest ) *pnLa
a060: 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74  rgest = nLargest
a070: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  ../*.** If a Win
a090: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
a0a0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a0b0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
a0c0: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
a0d0: 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64  o.** destroy and
a0e0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20 49   recreate it.  I
a0f0: 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  f the Win32 nati
a100: 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69  ve heap is not i
a110: 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a  solated and/or.*
a120: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65  * the sqlite3_me
a130: 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63  mory_used() func
a140: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
a150: 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54  turn zero, SQLIT
a160: 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62  E_BUSY will.** b
a170: 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  e returned and n
a180: 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  o changes will b
a190: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69  e made to the Wi
a1a0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e  n32 native heap.
a1b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a1c0: 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70  win32_reset_heap
a1d0: 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  (){.  int rc;.  
a1e0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
a1f0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
a200: 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61  ter; ) /* The ma
a210: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
a220: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
a230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
a240: 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54  *pMem; )    /* T
a250: 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63  he memsys static
a260: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a270: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
a280: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
a290: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a2a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a2b0: 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  ; ).  MUTEX_LOGI
a2c0: 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65  C( pMem = sqlite
a2d0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a2e0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a2f0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
a300: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
a310: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
a320: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
a330: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
a340: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
a350: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a360: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
a370: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
a380: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a390: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
a3a0: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
a3b0: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
a3c0: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
a3d0: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
a3e0: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
a3f0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
a400: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
a410: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
a420: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
a430: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
a440: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
a450: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
a460: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
a470: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
a480: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
a490: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
a4a0: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
a4b0: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
a4c0: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
a4d0: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
a4e0: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
a4f0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
a500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
a510: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
a520: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
a530: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
a540: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
a550: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
a560: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
a570: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
a580: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
a590: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
a5a0: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
a5b0: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
a5c0: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
a5d0: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
a5e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a5f0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
a600: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
a610: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
a620: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
a630: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
a640: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
a650: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
a660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a670: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a680: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
a690: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
a6a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a6b0: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
a6c0: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
a6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
a6e0: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
a6f0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
a700: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
a710: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
a720: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
a730: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a740: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
a750: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
a760: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
a770: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a780: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a790: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a7a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a7b0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
a7c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
a7d0: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
a7e0: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
a7f0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
a800: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
a810: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
a820: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
a830: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
a840: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
a850: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
a860: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
a870: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a880: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
a890: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
a8a0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a8b0: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
a8c0: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
a8d0: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
a8e0: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
a8f0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
a900: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
a910: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
a920: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
a930: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
a940: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a950: 5a 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ZE );.#ifdef SQL
a960: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
a970: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 42 75 66  RMOR.  if( !zBuf
a980: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
a990: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
a9a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
a9b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
a9c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a9d0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66  2_HAS_ANSI).  if
a9e0: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
a9f0: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
aa00: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
aa10: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
aa20: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
aa30: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
aa40: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
aa50: 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66  gStringA(zDbgBuf
aa60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
aa70: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
aa80: 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  ingA(zBuf);.  }.
aa90: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
aaa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
aab0: 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44  IDE).  memset(zD
aac0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
aad0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
aae0: 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d  IZE);.  if ( osM
aaf0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
ab00: 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73  ar(.          os
ab10: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
ab20: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
ab30: 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a  OEMCP, 0, zBuf,.
ab40: 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20            nMin, 
ab50: 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c  (LPWSTR)zDbgBuf,
ab60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
ab70: 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f  G_BUF_SIZE/sizeo
ab80: 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a  f(WCHAR))<=0 ){.
ab90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
aba0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
abb0: 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29  tringW((LPCWSTR)
abc0: 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a  zDbgBuf);.#else.
abd0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
abe0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
abf0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
ac00: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
ac10: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
ac20: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
ac30: 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  n);.    fprintf(
ac40: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44  stderr, "%s", zD
ac50: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
ac60: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
ac70: 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  err, "%s", zBuf)
ac80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
ac90: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
aca0: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70  ing routine susp
acb0: 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74  ends the current
acc0: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
acd0: 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69  east ms.** milli
ace0: 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69  seconds.  This i
acf0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
ad00: 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28  the Win32 Sleep(
ad10: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
ad20: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
ad30: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
ad40: 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c  E sleepObj = NUL
ad50: 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20  L;.#endif..void 
ad60: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
ad70: 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73  eep(DWORD millis
ad80: 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c  econds){.#if SQL
ad90: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
ada0: 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55  f ( sleepObj==NU
adb0: 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f  LL ){.    sleepO
adc0: 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65  bj = osCreateEve
add0: 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ntExW(NULL, NULL
ade0: 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d  , CREATE_EVENT_M
adf0: 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20  ANUAL_RESET,.   
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59 4e               SYN
ae20: 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20  CHRONIZE);.  }. 
ae30: 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62   assert( sleepOb
ae40: 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57  j!=NULL );.  osW
ae50: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
ae60: 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d  ctEx(sleepObj, m
ae70: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c  illiseconds, FAL
ae80: 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53  SE);.#else.  osS
ae90: 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64  leep(millisecond
aea0: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69  s);.#endif.}..#i
aeb0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
aec0: 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26  KER_THREADS>0 &&
aed0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
aee0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
aef0: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
af00: 20 20 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44     SQLITE_THREAD
af10: 53 41 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c  SAFE>0.DWORD sql
af20: 69 74 65 33 57 69 6e 33 32 57 61 69 74 28 48 41  ite3Win32Wait(HA
af30: 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20  NDLE hObject){. 
af40: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69   DWORD rc;.  whi
af50: 6c 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74  le( (rc = osWait
af60: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
af70: 78 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e  x(hObject, INFIN
af80: 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ITE,.           
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55 45              TRUE
afb0: 29 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50  ))==WAIT_IO_COMP
afc0: 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74  LETION ){}.  ret
afd0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
afe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
aff0: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
b000: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
b010: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
b020: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
b030: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
b040: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
b050: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
b060: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
b070: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
b080: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
b090: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
b0a0: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
b0b0: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
b0c0: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
b0d0: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
b0e0: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
b0f0: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
b100: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
b110: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
b120: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
b130: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
b140: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
b150: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
b160: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
b170: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
b180: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
b190: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
b1a0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
b1b0: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
b1c0: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
b1d0: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
b1e0: 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  PI..*/..#if !SQL
b1f0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
b200: 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20  SIONEX.# define 
b210: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65  osIsNT()  (1).#e
b220: 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  lif SQLITE_OS_WI
b230: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
b240: 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e  _WINRT || !defin
b250: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b260: 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69  HAS_ANSI).# defi
b270: 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29  ne osIsNT()  (1)
b280: 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28  .#elif !defined(
b290: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b2a0: 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20  _WIDE).# define 
b2b0: 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65  osIsNT()  (0).#e
b2c0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  lse.# define osI
b2d0: 73 4e 54 28 29 20 20 28 28 73 71 6c 69 74 65 33  sNT()  ((sqlite3
b2e0: 5f 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20  _os_type==2) || 
b2f0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73  sqlite3_win32_is
b300: 5f 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  _nt()).#endif../
b310: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b320: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
b330: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20   the machine is 
b340: 72 75 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f  running a versio
b350: 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20  n of Windows.** 
b360: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20  based on the NT 
b370: 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  kernel..*/.int s
b380: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f  qlite3_win32_is_
b390: 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51  nt(void){.#if SQ
b3a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
b3b0: 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68  /*.  ** NOTE: Th
b3c0: 65 20 57 69 6e 52 54 20 73 75 62 2d 70 6c 61 74  e WinRT sub-plat
b3d0: 66 6f 72 6d 20 69 73 20 61 6c 77 61 79 73 20 61  form is always a
b3e0: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
b3f0: 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a  ed on the NT.  *
b400: 2a 20 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a  *       kernel..
b410: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b    */.  return 1;
b420: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 57 49  .#elif SQLITE_WI
b430: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
b440: 0a 20 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f  .  if( osInterlo
b450: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
b460: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
b470: 74 79 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29  type, 0, 0)==0 )
b480: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
b490: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
b4a0: 4e 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49  NSI).    OSVERSI
b4b0: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
b4c0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
b4d0: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
b4e0: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
b4f0: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
b500: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  A(&sInfo);.    o
b510: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
b520: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
b530: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20  ite3_os_type,.  
b540: 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50        (sInfo.dwP
b550: 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52  latformId == VER
b560: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
b570: 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b  NT) ? 2 : 1, 0);
b580: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
b590: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b5a0: 57 49 44 45 29 0a 20 20 20 20 4f 53 56 45 52 53  WIDE).    OSVERS
b5b0: 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a  IONINFOW sInfo;.
b5c0: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
b5d0: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
b5e0: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
b5f0: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
b600: 78 57 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xW(&sInfo);.    
b610: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
b620: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
b630: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20  lite3_os_type,. 
b640: 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77         (sInfo.dw
b650: 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45  PlatformId == VE
b660: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
b670: 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29  _NT) ? 2 : 1, 0)
b680: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
b690: 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63  eturn osInterloc
b6a0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
b6b0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
b6c0: 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23  ype, 2, 2)==2;.#
b6d0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  elif SQLITE_TEST
b6e0: 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65  .  return osInte
b6f0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b700: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b710: 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d  os_type, 2, 2)==
b720: 32 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  2;.#else.  /*.  
b730: 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62  ** NOTE: All sub
b740: 2d 70 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65  -platforms where
b750: 20 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45   the GetVersionE
b760: 78 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20  x[AW] functions 
b770: 61 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 64  are.  **       d
b780: 65 70 72 65 63 61 74 65 64 20 61 72 65 20 61 6c  eprecated are al
b790: 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ways assumed to 
b7a0: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
b7b0: 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a  NT kernel..  */.
b7c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
b7d0: 69 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  if.}..#ifdef SQL
b7e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b7f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
b800: 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79  nBytes of memory
b810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b820: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
b830: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
b840: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
b850: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
b860: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b870: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b880: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b890: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b8a0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b8b0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b8c0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b8d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b8e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b8f0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b900: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b910: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b920: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b930: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b940: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
b950: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
b960: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48  >=0 );.  p = osH
b970: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
b980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b990: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
b9a0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  )nBytes);.  if( 
b9b0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
b9c0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
b9d0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
b9e0: 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65  eapAlloc %u byte
b9f0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
ba00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ba10: 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74     nBytes, osGet
ba20: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
ba30: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
ba40: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
ba50: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
ba60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ba70: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
ba80: 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e   *pPrior){.  HAN
ba90: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
baa0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
bab0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
bac0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
bad0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
bae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
baf0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
bb00: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
bb10: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
bb20: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
bb30: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
bb40: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
bb50: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
bb60: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
bb70: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
bb80: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
bb90: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
bba0: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
bbb0: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
bbc0: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
bbd0: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
bbe0: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
bbf0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bc00: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
bc10: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
bc20: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
bc30: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
bc40: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
bc50: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
bc60: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
bc70: 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65      pPrior, osGe
bc80: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
bc90: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
bca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
bcb0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
bcc0: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
bcd0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
bce0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
bcf0: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
bd00: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
bd10: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
bd20: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
bd30: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bd40: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bd50: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bd70: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
bd80: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bd90: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bda0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bdb0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bdc0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bdd0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
bde0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
bdf0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
be00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
be10: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
be20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
be30: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
be40: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
be50: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
be60: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
be70: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
be80: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
be90: 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
bea0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65      p = osHeapRe
beb0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
bec0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bed0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53  LAGS, pPrior, (S
bee0: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
bef0: 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20   }.  if( !p ){. 
bf00: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
bf10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
bf20: 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79  iled to %s %u by
bf30: 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d  tes (%lu), heap=
bf40: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
bf50: 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48       pPrior ? "H
bf60: 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48  eapReAlloc" : "H
bf70: 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65  eapAlloc", nByte
bf80: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
bf90: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
bfa0: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
bfb0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
bfc0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
bfd0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
bfe0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  an outstanding a
bff0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79  llocation, in by
c000: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
c010: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
c020: 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45  id *p){.  HANDLE
c030: 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54   hHeap;.  SIZE_T
c040: 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73   n;..  winMemAss
c050: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
c060: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
c070: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
c080: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
c090: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
c0a0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
c0b0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
c0c0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
c0d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
c0e0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
c0f0: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
c100: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
c110: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c120: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20  _HEAP_FLAGS, p) 
c130: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
c140: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
c150: 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28   n = osHeapSize(
c160: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c170: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c180: 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49  p);.  if( n==(SI
c190: 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73  ZE_T)-1 ){.    s
c1a0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
c1b0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
c1c0: 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f   to HeapSize blo
c1d0: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
c1e0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
c1f0: 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c         p, osGetL
c200: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
c210: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72  d*)hHeap);.    r
c220: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
c230: 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a  eturn (int)n;.}.
c240: 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20  ./*.** Round up 
c250: 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74  a request size t
c260: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64  o the next valid
c270: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
c280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c290: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
c2a0: 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e  t n){.  return n
c2b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
c2c0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
c2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c2e0: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
c2f0: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
c300: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
c310: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
c320: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
c330: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
c340: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
c350: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
c360: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c370: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
c380: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
c390: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c3a0: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
c3b0: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66  M_MAGIC2 );..#if
c3c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
c3d0: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
c3e0: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
c3f0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c400: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44  ->hHeap ){.    D
c410: 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69  WORD dwInitialSi
c420: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ze = SQLITE_WIN3
c430: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
c440: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61  ;.    DWORD dwMa
c450: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f  ximumSize = (DWO
c460: 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  RD)sqlite3Global
c470: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20  Config.nHeap;.  
c480: 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53    if( dwMaximumS
c490: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
c4a0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
c4b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c4c0: 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20  P_MAX_SIZE;.    
c4d0: 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74  }else if( dwInit
c4e0: 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75  ialSize>dwMaximu
c4f0: 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64  mSize ){.      d
c500: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64  wInitialSize = d
c510: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20  wMaximumSize;.  
c520: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
c530: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
c540: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
c550: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c560: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 64 77 49 6e 69 74 69           dwIniti
c590: 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75  alSize, dwMaximu
c5a0: 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  mSize);.    if( 
c5b0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
c5c0: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
c5d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c5e0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
c5f0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c600: 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c  Create (%lu), fl
c610: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
c620: 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c  =%lu, maxSize=%l
c630: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
c640: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
c650: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c660: 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69  P_FLAGS, dwIniti
c670: 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  alSize,.        
c680: 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29    dwMaximumSize)
c690: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
c6a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
c6b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
c6c0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c6d0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65  = TRUE;.    asse
c6e0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c6f0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  >bOwned );.  }.#
c700: 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61  else.  pWinMemDa
c710: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65  ta->hHeap = osGe
c720: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a  tProcessHeap();.
c730: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
c740: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
c750: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c760: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
c770: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65     "failed to Ge
c780: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c  tProcessHeap (%l
c790: 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  u)", osGetLastEr
c7a0: 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75  ror());.    retu
c7b0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c7c0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  BKPT;.  }.  pWin
c7d0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c7e0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
c7f0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
c800: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
c810: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
c820: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c830: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c840: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c850: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
c860: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
c870: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c880: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c890: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
c8a0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c8b0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c8c0: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
c8d0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c8e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
c8f0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
c900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c910: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
c920: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
c930: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
c940: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
c950: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
c960: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c970: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c980: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c990: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c9a0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c9b0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
c9c0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c9d0: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
c9e0: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
c9f0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
ca00: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
ca10: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
ca20: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
ca30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ca40: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
ca50: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
ca60: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
ca70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
ca80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ca90: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
caa0: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
cab0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
cac0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
cad0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
cae0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
caf0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
cb00: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
cb10: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
cb20: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
cb30: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
cb40: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
cb50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cb60: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
cb70: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
cb80: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
cb90: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
cbb0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
cbc0: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
cbd0: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
cbe0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
cbf0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
cc00: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
cc10: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
cc20: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
cc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
cc40: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
cc50: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
cc60: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
cc70: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
cc80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
cc90: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
cca0: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
ccb0: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
ccc0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
ccd0: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
cce0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
ccf0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
cd00: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
cd10: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
cd20: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
cd30: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
cd40: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
cd50: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
cd60: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
cd70: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
cd80: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
cd90: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
cda0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
cdb0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
cdc0: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
cdd0: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
cde0: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
cdf0: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
ce00: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
ce10: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
ce20: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
ce30: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
ce40: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
ce50: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
ce60: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
ce70: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
ce80: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
ce90: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
cea0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
ceb0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
cec0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
ced0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
cee0: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
cef0: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
cf00: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
cf10: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
cf20: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
cf30: 6f 66 74 20 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a  oft Unicode..**.
cf40: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
cf50: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
cf60: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
cf70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
cf80: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
cf90: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
cfa0: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
cfb0: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
cfc0: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
cfd0: 53 54 52 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a  STR zWideText;..
cfe0: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
cff0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d000: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65 78  CP_UTF8, 0, zTex
d010: 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  t, -1, NULL, 0);
d020: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
d030: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d040: 0a 20 20 7d 0a 20 20 7a 57 69 64 65 54 65 78 74  .  }.  zWideText
d050: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
d060: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
d070: 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 69  of(WCHAR) );.  i
d080: 66 28 20 7a 57 69 64 65 54 65 78 74 3d 3d 30 20  f( zWideText==0 
d090: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d0a0: 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f  .  }.  nChar = o
d0b0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
d0c0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
d0d0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64   zText, -1, zWid
d0e0: 65 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  eText,.         
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20         nChar);. 
d110: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
d120: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d130: 65 28 7a 57 69 64 65 54 65 78 74 29 3b 0a 20 20  e(zWideText);.  
d140: 20 20 7a 57 69 64 65 54 65 78 74 20 3d 20 30 3b    zWideText = 0;
d150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
d160: 69 64 65 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ideText;.}../*.*
d170: 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72  * Convert a Micr
d180: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74  osoft Unicode st
d190: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a  ring to UTF-8..*
d1a0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
d1b0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
d1c0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
d1d0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
d1e0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
d1f0: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
d200: 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53  codeToUtf8(LPCWS
d210: 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b 0a 20  TR zWideText){. 
d220: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
d230: 61 72 20 2a 7a 54 65 78 74 3b 0a 0a 20 20 6e 42  ar *zText;..  nB
d240: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d250: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
d260: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  TF8, 0, zWideTex
d270: 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  t, -1, 0, 0, 0, 
d280: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
d290: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
d2a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78  rn 0;.  }.  zTex
d2b0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
d2c0: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
d2d0: 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29    if( zText==0 )
d2e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d2f0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d300: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d310: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
d320: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a  zWideText, -1, z
d330: 54 65 78 74 2c 20 6e 42 79 74 65 2c 0a 20 20 20  Text, nByte,.   
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
d360: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
d370: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
d380: 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b  te3_free(zText);
d390: 0a 20 20 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a  .    zText = 0;.
d3a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 65    }.  return zTe
d3b0: 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  xt;.}../*.** Con
d3c0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
d3d0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
d3e0: 20 55 6e 69 63 6f 64 65 2c 20 75 73 69 6e 67 20   Unicode, using 
d3f0: 74 68 65 20 41 4e 53 49 20 6f 72 20 4f 45 4d 0a  the ANSI or OEM.
d400: 2a 2a 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a  ** code page..**
d410: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
d420: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
d430: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
d440: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
d450: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
d460: 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63  ic LPWSTR winMbc
d470: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
d480: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
d490: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e  t useAnsi){.  in
d4a0: 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54  t nByte;.  LPWST
d4b0: 52 20 7a 4d 62 63 73 54 65 78 74 3b 0a 20 20 69  R zMbcsText;.  i
d4c0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73  nt codepage = us
d4d0: 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a  eAnsi ? CP_ACP :
d4e0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d4f0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
d500: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
d510: 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20  page, 0, zText, 
d520: 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  -1, NULL,.      
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a            0)*siz
d550: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66  eof(WCHAR);.  if
d560: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
d570: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d580: 20 20 7a 4d 62 63 73 54 65 78 74 20 3d 20 73 71    zMbcsText = sq
d590: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
d5a0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 57 43   nByte*sizeof(WC
d5b0: 48 41 52 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  HAR) );.  if( zM
d5c0: 62 63 73 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  bcsText==0 ){.  
d5d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d5e0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
d5f0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d600: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 54 65  codepage, 0, zTe
d610: 78 74 2c 20 2d 31 2c 20 7a 4d 62 63 73 54 65 78  xt, -1, zMbcsTex
d620: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28     nByte);.  if(
d650: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
d660: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
d670: 62 63 73 54 65 78 74 29 3b 0a 20 20 20 20 7a 4d  bcsText);.    zM
d680: 62 63 73 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d  bcsText = 0;.  }
d690: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 54  .  return zMbcsT
d6a0: 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ext;.}../*.** Co
d6b0: 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73 6f 66  nvert a Microsof
d6c0: 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  t Unicode string
d6d0: 20 74 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   to a multi-byte
d6e0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
d6f0: 67 2c 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  g,.** using the 
d700: 41 4e 53 49 20 6f 72 20 4f 45 4d 20 63 6f 64 65  ANSI or OEM code
d710: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   page..**.** Spa
d720: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d730: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d740: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
d750: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
d770: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62   *winUnicodeToMb
d780: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
d790: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
d7a0: 69 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  i){.  int nByte;
d7b0: 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a  .  char *zText;.
d7c0: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
d7d0: 20 75 73 65 41 6e 73 69 20 3f 20 43 50 5f 41 43   useAnsi ? CP_AC
d7e0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
d7f0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
d800: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
d810: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
d820: 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c  eText, -1, 0, 0,
d830: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d840: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d860: 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d  zText = sqlite3M
d870: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
d880: 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d   );.  if( zText=
d890: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d8a0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
d8b0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d8c0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
d8d0: 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20  , 0, zWideText, 
d8e0: 2d 31 2c 20 7a 54 65 78 74 2c 0a 20 20 20 20 20  -1, zText,.     
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
d910: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
d920: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
d930: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
d940: 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78 74 20  ext);.    zText 
d950: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
d960: 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zText;.}../*.*
d970: 2a 20 43 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74  * Convert a mult
d980: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
d990: 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38   string to UTF-8
d9a0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
d9b0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
d9c0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
d9d0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
d9e0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
d9f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
da00: 4d 62 63 73 54 6f 55 74 66 38 28 63 6f 6e 73 74  MbcsToUtf8(const
da10: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
da20: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68  t useAnsi){.  ch
da30: 61 72 20 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20  ar *zTextUtf8;. 
da40: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
da50: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
da60: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
da70: 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29  (zText, useAnsi)
da80: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
da90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
daa0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74  n 0;.  }.  zText
dab0: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
dac0: 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65  eToUtf8(zTmpWide
dad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
dae0: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
daf0: 65 74 75 72 6e 20 7a 54 65 78 74 55 74 66 38 3b  eturn zTextUtf8;
db00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
db10: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
db20: 20 74 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   to a multi-byte
db30: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
db40: 67 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  g..**.** Space t
db50: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
db60: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
db70: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
db80: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
db90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
dba0: 6e 55 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73  nUtf8ToMbcs(cons
dbb0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
dbc0: 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63  nt useAnsi){.  c
dbd0: 68 61 72 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a  har *zTextMbcs;.
dbe0: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
dbf0: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
dc00: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
dc10: 65 28 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20  e(zText);.  if( 
dc20: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
dc30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dc40: 0a 20 20 7a 54 65 78 74 4d 62 63 73 20 3d 20 77  .  zTextMbcs = w
dc50: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
dc60: 7a 54 6d 70 57 69 64 65 2c 20 75 73 65 41 6e 73  zTmpWide, useAns
dc70: 69 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  i);.  sqlite3_fr
dc80: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
dc90: 72 65 74 75 72 6e 20 7a 54 65 78 74 4d 62 63 73  return zTextMbcs
dca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
dcb0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
dcc0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55  per for the winU
dcd0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 29 20 66  tf8ToUnicode() f
dce0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53  unction..*/.LPWS
dcf0: 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  TR sqlite3_win32
dd00: 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65  _utf8_to_unicode
dd10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
dd20: 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt){.#ifdef SQLI
dd30: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
dd40: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
dd50: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
dd60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
dd70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
dd80: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
dd90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dda0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
ddb0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
ddc0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
ddd0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
dde0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
ddf0: 7a 54 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zText);.}../*.**
de00: 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c 69   This is a publi
de10: 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 68  c wrapper for th
de20: 65 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  e winUnicodeToUt
de30: 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  f8() function..*
de40: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
de50: 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f  win32_unicode_to
de60: 5f 75 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  _utf8(LPCWSTR zW
de70: 69 64 65 54 65 78 74 29 7b 0a 23 69 66 64 65 66  ideText){.#ifdef
de80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
de90: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
dea0: 7a 57 69 64 65 54 65 78 74 20 29 7b 0a 20 20 20  zWideText ){.   
deb0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
dec0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
ded0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
dee0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
def0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
df00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
df10: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
df20: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
df30: 20 72 65 74 75 72 6e 20 77 69 6e 55 6e 69 63 6f   return winUnico
df40: 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 54 65  deToUtf8(zWideTe
df50: 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
df60: 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77  is is a public w
df70: 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77  rapper for the w
df80: 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66  inMbcsToUtf8() f
df90: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72  unction..*/.char
dfa0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
dfb0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
dfc0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b  st char *zText){
dfd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
dfe0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
dff0: 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a    if( !zText ){.
e000: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
e010: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
e020: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e030: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
e040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
e050: 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  NIT.  if( sqlite
e060: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29  3_initialize() )
e070: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
e080: 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62  f.  return winMb
e090: 63 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20  csToUtf8(zText, 
e0a0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
e0b0: 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  I());.}../*.** T
e0c0: 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20  his is a public 
e0d0: 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20  wrapper for the 
e0e0: 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20  winMbcsToUtf8() 
e0f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
e100: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
e110: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32  _mbcs_to_utf8_v2
e120: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
e130: 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29  xt, int useAnsi)
e140: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e150: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e160: 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b  .  if( !zText ){
e170: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
e180: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e190: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e1a0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
e1b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e1c0: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
e1d0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
e1e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
e1f0: 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d  if.  return winM
e200: 62 63 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c  bcsToUtf8(zText,
e210: 20 75 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a   useAnsi);.}../*
e220: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75  .** This is a pu
e230: 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72  blic wrapper for
e240: 20 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62   the winUtf8ToMb
e250: 63 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  cs() function..*
e260: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
e270: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
e280: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
e290: 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51  Text){.#ifdef SQ
e2a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e2b0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65  ARMOR.  if( !zTe
e2c0: 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  xt ){.    (void)
e2d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e2e0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
e2f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
e300: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e310: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20  _AUTOINIT.  if( 
e320: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
e330: 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ze() ) return 0;
e340: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
e350: 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a   winUtf8ToMbcs(z
e360: 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 41  Text, osAreFileA
e370: 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f  pisANSI());.}../
e380: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
e390: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
e3a0: 72 20 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d  r the winUtf8ToM
e3b0: 62 63 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  bcs() function..
e3c0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
e3d0: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
e3e0: 62 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61  bcs_v2(const cha
e3f0: 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73  r *zText, int us
e400: 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 53  eAnsi){.#ifdef S
e410: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e420: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54  _ARMOR.  if( !zT
e430: 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ext ){.    (void
e440: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e450: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
e460: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
e470: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e480: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
e490: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
e4a0: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
e4b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
e4c0: 6e 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  n winUtf8ToMbcs(
e4d0: 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b  zText, useAnsi);
e4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
e4f0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
e500: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
e510: 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
e520: 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64   directory based
e530: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69   on.** the provi
e540: 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ded arguments.  
e550: 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e  The type argumen
e560: 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f  t must be 1 in o
e570: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a  rder to set the.
e580: 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  ** data director
e590: 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20  y or 2 in order 
e5a0: 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f  to set the tempo
e5b0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
e5c0: 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61   The zValue.** a
e5d0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
e5e0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
e5f0: 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68  tory to use.  Th
e600: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  e return value w
e610: 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45  ill be.** SQLITE
e620: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
e630: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
e640: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
e650: 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65  ctory(DWORD type
e660: 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65  , LPCWSTR zValue
e670: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69  ){.  char **ppDi
e680: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66  rectory = 0;.#if
e690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e6a0: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20  _AUTOINIT.  int 
e6b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
e6c0: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
e6d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
e6e0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79  .#endif.  if( ty
e6f0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
e700: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
e710: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
e720: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
e730: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
e740: 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  y;.  }else if( t
e750: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
e760: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
e770: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
e780: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
e790: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
e7a0: 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ry;.  }.  assert
e7b0: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
e7c0: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
e7d0: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
e7e0: 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20  ORY_TYPE.       
e7f0: 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49     || type==SQLI
e800: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
e810: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29  RECTORY_TYPE.  )
e820: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  ;.  assert( !ppD
e830: 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69  irectory || sqli
e840: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
e850: 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c  pe(*ppDirectory,
e860: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
e870: 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74  ;.  if( ppDirect
e880: 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ory ){.    char 
e890: 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b  *zValueUtf8 = 0;
e8a0: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
e8b0: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
e8c0: 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38        zValueUtf8
e8d0: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
e8e0: 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20  tf8(zValue);.   
e8f0: 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74     if ( zValueUt
e900: 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f8==0 ){.       
e910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e920: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
e930: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e940: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
e950: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
e960: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
e970: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
e980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e990: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e9a0: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
e9b0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
e9c0: 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74  ue of winGetLast
e9d0: 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a  ErrorMsg.** is z
e9e0: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
e9f0: 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
ea00: 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
ea10: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
ea20: 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
ea30: 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
ea40: 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ted)..*/.static 
ea50: 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
ea60: 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73  rorMsg(DWORD las
ea70: 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66  tErrno, int nBuf
ea80: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
ea90: 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   /* FormatMessag
eaa0: 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66  e returns 0 on f
eab0: 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69  ailure.  Otherwi
eac0: 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72  se it.  ** retur
ead0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
eae0: 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20   TCHARs written 
eaf0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  to the output.  
eb00: 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75  ** buffer, exclu
eb10: 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61  ding the termina
eb20: 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a  ting null char..
eb30: 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c    */.  DWORD dwL
eb40: 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  en = 0;.  char *
eb50: 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  zOut = 0;..  if(
eb60: 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
eb70: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
eb80: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
eb90: 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33  Wide[SQLITE_WIN3
eba0: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
ebb0: 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e  RS+1];.    dwLen
ebc0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
ebd0: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
ebe0: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
ebf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
ec10: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
ec20: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a            NULL,.
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
ec70: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a       zTempWide,.
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
ece0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
ecf0: 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20  RMSG_CHARS,.    
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c           0);.#el
ed20: 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  se.    LPWSTR zT
ed30: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
ed40: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
ed50: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
ed60: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
ed70: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
eda0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
edb0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
ede0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
edf0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
ee80: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
ee90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
eeb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
eed0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
eee0: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
eef0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
ef00: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
ef10: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
ef20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
ef30: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
ef40: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77  ;.      zOut = w
ef50: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
ef60: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
ef70: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
ef80: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20  gnMalloc();.#if 
ef90: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
efa0: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
efb0: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
efc0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
efd0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
efe0: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
eff0: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e  (zTempWide);.#en
f000: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  dif.    }.  }.#i
f010: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
f020: 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
f030: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
f040: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
f050: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
f060: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
f070: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
f080: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
f0b0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
f0c0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
f0f0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
f120: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
f140: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26         (LPSTR) &
f190: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
f1e0: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
f1f0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
f200: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
f210: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
f220: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
f230: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
f240: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  .      zOut = wi
f250: 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54 65 6d  nMbcsToUtf8(zTem
f260: 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  p, osAreFileApis
f270: 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 20 20 73  ANSI());.      s
f280: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
f290: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f  alloc();.      /
f2a0: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
f2b0: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
f2c0: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
f2d0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
f2e0: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
f2f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f300: 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  f.  if( 0 == dwL
f310: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
f320: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
f330: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
f340: 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61  0x%lx (%lu)", la
f350: 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72  stErrno, lastErr
f360: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
f370: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
f380: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
f390: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
f3a0: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
f3b0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
f3c0: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
f3d0: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
f3e0: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
f3f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
f400: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
f410: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
f420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
f430: 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72  tion - winLogErr
f440: 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20  orAtLine() - is 
f450: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
f460: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
f470: 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e  * winLogError().
f480: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f490: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
f4a0: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
f4b0: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
f4c0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f  nction..** It lo
f4d0: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
f4e0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
f4f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f500: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
f510: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
f520: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
f530: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
f540: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
f550: 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  rom.** FormatMes
f560: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
f570: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
f580: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
f590: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
f5a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
f5b0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
f5c0: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
f5d0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
f5e0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
f5f0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54  _CANTOPEN)..** T
f600: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
f610: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
f620: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
f630: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
f640: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
f650: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
f660: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
f670: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
f680: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
f690: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
f6a0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
f6b0: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
f6c0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
f6d0: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
f6e0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
f710: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
f720: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f740: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
f750: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
f760: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
f770: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
f780: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
f790: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
f7a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
f7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f7c0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
f7d0: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
f7e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
f810: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
f820: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
f830: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
f840: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
f850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
f860: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
f870: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
f880: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f8a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f8b0: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
f8c0: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
f8d0: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
f8e0: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
f8f0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
f900: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
f910: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
f920: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
f930: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
f940: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
f950: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
f960: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
f970: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
f980: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
f990: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
f9a0: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
f9b0: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
f9c0: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
f9d0: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
f9e0: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
f9f0: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
fa00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
fa10: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
fa20: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
fa30: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
fa40: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
fa50: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
fa60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
fa70: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
fa80: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a  ably caused by.*
fa90: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
faa0: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
fab0: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
fac0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
fad0: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
fae0: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
faf0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
fb00: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
fb10: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
fb20: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
fb30: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
fb40: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
fb50: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
fb60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
fb70: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
fb80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
fb90: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
fba0: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
fbb0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
fbc0: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
fbd0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
fbe0: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
fbf0: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
fc00: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
fc10: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
fc20: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LAY;../*.** The 
fc30: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
fc40: 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65  y1" macro is use
fc50: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
fc60: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 49  f a particular I
fc70: 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  /O.** error code
fc80: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65   obtained via Ge
fc90: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20  tLastError() is 
fca0: 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72  eligible to be r
fcb0: 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d  etried.  It.** m
fcc0: 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20 65  ust accept the e
fcd0: 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20  rror code DWORD 
fce0: 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  as its only argu
fcf0: 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20  ment and should 
fd00: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
fd10: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
fd20: 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e  code is transien
fd30: 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20  t in nature and 
fd40: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
fd50: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
fd60: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
fd70: 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d  original error m
fd80: 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70 6f  ight succeed upo
fd90: 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69  n being.** retri
fda0: 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  ed.  The argumen
fdb0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
fdc0: 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69  should be a vari
fdd0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  able..**.** Addi
fde0: 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72  tionally, a macr
fdf0: 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72  o named "winIoer
fe00: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20  rCanRetry2" may 
fe10: 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20  be defined.  If 
fe20: 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  it.** is defined
fe30: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  , it will be con
fe40: 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  sulted only when
fe50: 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49   the macro "winI
fe60: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a  oerrCanRetry1".*
fe70: 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  * returns zero. 
fe80: 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   The "winIoerrCa
fe90: 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69  nRetry2" macro i
fea0: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74  s completely opt
feb0: 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79  ional and.** may
fec0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c   be used to incl
fed0: 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ude additional e
fee0: 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68  rror codes in th
fef0: 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c  e set that shoul
ff00: 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74  d.** result in t
ff10: 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f  he failing I/O o
ff20: 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72  peration being r
ff30: 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61  etried by the ca
ff40: 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66  ller.  If.** def
ff50: 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f  ined, the "winIo
ff60: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ff70: 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74  cro must exhibit
ff80: 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74   external semant
ff90: 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  ics.** identical
ffa0: 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65   to those of the
ffb0: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
ffc0: 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  ry1" macro..*/.#
ffd0: 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49  if !defined(winI
ffe0: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23  oerrCanRetry1).#
fff0: 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43  define winIoerrC
10000 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61  anRetry1(a) (((a
10010 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  )==ERROR_ACCESS_
10020 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c  DENIED)        |
10030 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48    ((a)==ERROR_SH
10060 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
10070 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
100a0 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
100b0 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  N)       || \.  
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
100e0 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f  ==ERROR_DEV_NOT_
100f0 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c  EXIST)        ||
10100 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
10130 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20  NAME_DELETED)   
10140 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
10170 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20  R_SEM_TIMEOUT)  
10180 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
101b0 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55  =ERROR_NETWORK_U
101c0 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e  NREACHABLE)).#en
101d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  dif../*.** If a 
101e0 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
101f0 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
10200 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
10210 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
10220 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
10230 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
10240 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
10250 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
10260 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
10270 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
10280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10290 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
102a0 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
102b0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
102c0 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
102d0 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
102e0 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
102f0 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
10300 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
10310 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
10320 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
10330 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
10340 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 65  IoerrCanRetry1(e
10350 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
10360 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
10370 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
10380 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
10390 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
103a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
103b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e  .#if defined(win
103c0 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a  IoerrCanRetry2).
103d0 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f    else if( winIo
103e0 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29 20  errCanRetry2(e) 
103f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
10400 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f  in32_sleep(winIo
10410 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
10420 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
10430 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
10440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
10450 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72 72  endif.  if( pErr
10460 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
10470 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
10480 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
10490 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
104a0 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
104b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
104c0 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
104d0 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  etry, int lineno
104e0 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20  ){.  if( nRetry 
104f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
10500 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
10510 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64  ,.      "delayed
10520 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73   %dms for lock/s
10530 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  haring conflict 
10540 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20 20 20  at line %d",.   
10550 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
10560 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52  Delay*nRetry*(nR
10570 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e  etry+1)/2, linen
10580 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
10590 2f 2a 0a 2a 2a 20 54 68 69 73 20 23 69 66 20 64  /*.** This #if d
105a0 6f 65 73 20 6e 6f 74 20 72 65 6c 79 20 6f 6e 20  oes not rely on 
105b0 74 68 65 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  the SQLITE_OS_WI
105c0 4e 43 45 20 64 65 66 69 6e 65 20 62 65 63 61 75  NCE define becau
105d0 73 65 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  se the.** corres
105e0 70 6f 6e 64 69 6e 67 20 73 65 63 74 69 6f 6e 20  ponding section 
105f0 69 6e 20 22 64 61 74 65 2e 63 22 20 63 61 6e 6e  in "date.c" cann
10600 6f 74 20 75 73 65 20 69 74 2e 0a 2a 2f 0a 23 69  ot use it..*/.#i
10610 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
10620 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45  E_OMIT_LOCALTIME
10630 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 57 49  ) && defined(_WI
10640 4e 33 32 5f 57 43 45 29 20 26 26 20 5c 0a 20 20  N32_WCE) && \.  
10650 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
10660 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
10670 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54  E_API) || !SQLIT
10680 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45  E_MSVC_LOCALTIME
10690 5f 41 50 49 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _API)./*.** The 
106a0 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
106b0 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
106c0 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
106d0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53  ) function..** S
106e0 6f 20 64 65 66 69 6e 65 20 61 20 73 75 62 73 74  o define a subst
106f0 69 74 75 74 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63  itute..*/.#  inc
10700 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
10710 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
10720 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
10730 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
10740 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
10750 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
10760 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
10770 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
10780 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
10790 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
107a0 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
107b0 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
107c0 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
107d0 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
107e0 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
107f0 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
10800 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
10810 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
10820 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
10830 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
10840 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
10850 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
10860 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
10870 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
10880 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
10890 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
108a0 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
108b0 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
108c0 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
108d0 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
108e0 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
108f0 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
10900 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
10910 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
10920 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
10930 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
10940 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
10950 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
109a0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
109b0 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
109c0 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
109d0 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
109e0 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
109f0 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
10a00 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
10a10 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
10a20 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
10a30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
10a40 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
10a50 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
10a60 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
10a70 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
10a80 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
10a90 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
10aa0 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
10ab0 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
10ac0 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
10ad0 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
10ae0 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
10af0 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
10b00 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
10b10 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
10b20 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
10b30 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
10b40 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
10b50 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
10b60 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
10b70 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
10b80 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
10b90 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
10ba0 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
10bb0 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
10bc0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
10bd0 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
10be0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
10bf0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
10c00 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
10c10 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
10c20 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
10c30 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
10c40 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
10c50 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
10c60 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55  ..  zName = winU
10c70 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
10c80 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
10c90 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
10ca0 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
10cb0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10cc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
10cd0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
10ce0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10cf0 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
10d00 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
10d10 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
10d20 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
10d30 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
10d40 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
10d50 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
10d60 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
10d70 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
10d80 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
10d90 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
10da0 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
10db0 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
10dc0 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
10dd0 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
10de0 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
10df0 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
10e00 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
10e10 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
10e20 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
10e30 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
10e40 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
10e50 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
10e60 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
10e70 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10e80 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10e90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
10ea0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
10eb0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
10ec0 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
10ed0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
10f00 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
10f10 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  e);.  }..  /* Ac
10f20 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
10f30 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
10f40 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
10f50 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
10f60 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  hMutex);..  /* S
10f70 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
10f80 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
10f90 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
10fa0 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
10fb0 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  re.  ** case-sen
10fc0 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
10fd0 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
10fe0 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
10ff0 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
11000 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
11010 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
11020 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
11030 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
11040 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
11050 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
11060 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
11070 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
11080 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
11090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
110c0 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
110d0 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a         zName);..
11110 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20    /* Set a flag 
11120 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77  that indicates w
11130 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74  e're the first t
11140 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d  o create the mem
11150 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d  ory so it.  ** m
11160 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
11170 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73  ialized */.  las
11180 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11190 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20  stError();.  if 
111a0 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52  (lastErrno == ER
111b0 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
111c0 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
111d0 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73   FALSE;.  }..  s
111e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
111f0 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
11200 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
11210 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
11220 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
11230 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  p it. */.  if( p
11240 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b  File->hShared ){
11250 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
11260 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
11270 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
11280 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
11290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49  .             FI
112a0 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45  LE_MAP_READ|FILE
112b0 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30  _MAP_WRITE, 0, 0
112c0 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
112d0 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ck));.    /* If 
112e0 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20  mapping failed, 
112f0 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64  close the shared
11300 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61   memory handle a
11310 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20  nd erase it */. 
11320 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73     if( !pFile->s
11330 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70  hared ){.      p
11340 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11350 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11360 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  ();.      winLog
11370 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
11380 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
11390 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
113a0 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
113b0 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
113c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c  ename);.      bL
113d0 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  ogged = TRUE;.  
113e0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
113f0 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
11400 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11410 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a  hShared = NULL;.
11420 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11430 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  If shared memory
11440 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72   could not be cr
11450 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73  eated, then clos
11460 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
11470 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46  fail */.  if( pF
11480 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55  ile->hShared==NU
11490 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62  LL ){.    if( !b
114a0 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20  Logged ){.      
114b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
114c0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
114d0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
114e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
114f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
11520 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck3", zFilename)
11530 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
11540 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11550 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
11560 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
11570 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
11580 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
11590 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
115a0 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
115b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
115c0 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20  E_IOERR;.  }..  
115d0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
115e0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
115f0 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65  if we're suppose
11600 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49  d to */.  if( bI
11610 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  nit ){.    memse
11620 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c  t(pFile->shared,
11630 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
11640 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77  Lock));.  }..  w
11650 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11660 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11670 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11680 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
11690 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f  stroy the part o
116a0 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64  f winFile that d
116b0 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20  eals with wince 
116c0 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20  locks.*/.static 
116d0 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f  void winceDestro
116e0 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  yLock(winFile *p
116f0 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69  File){.  if (pFi
11700 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
11710 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
11720 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
11730 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
11740 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
11750 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
11760 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75  wing blocks shou
11770 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65  ld probably asse
11780 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65  rt in debug mode
11790 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20  , but they.     
117a0 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70    are to cleanup
117b0 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63   in case any loc
117c0 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e  ks remained open
117d0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
117e0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
117f0 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  s){.      pFile-
11800 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11810 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s --;.    }.    
11820 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11830 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20  .bReserved){.   
11840 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
11850 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
11860 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
11870 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11880 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
11890 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
118a0 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
118b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
118c0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
118d0 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
118e0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
118f0 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
11900 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
11910 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e   De-reference an
11920 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79  d close our copy
11930 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d   of the shared m
11940 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a  emory handle */.
11950 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f      osUnmapViewO
11960 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61  fFile(pFile->sha
11970 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  red);.    osClos
11980 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
11990 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
119a0 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
119b0 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
119c0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
119d0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
119e0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
119f0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11a00 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
11a10 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
11a20 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
11a30 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11a40 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
11a50 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
11a60 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
11a70 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
11a80 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
11a90 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
11aa0 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
11ab0 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
11ac0 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
11ad0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
11ae0 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
11af0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
11b00 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
11b10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
11b20 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
11b30 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
11b40 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
11b50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11b60 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
11b70 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
11b80 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
11b90 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
11ba0 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
11bb0 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
11bc0 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
11bd0 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
11be0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
11bf0 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
11c00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
11c10 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
11c20 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11c30 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
11c40 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
11c50 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
11c60 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
11c70 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
11c80 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
11c90 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
11ca0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11cb0 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
11cc0 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
11cd0 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
11ce0 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
11cf0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
11d00 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
11d10 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
11d20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11d30 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
11d40 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
11d50 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11d60 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11d70 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
11d80 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
11d90 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
11da0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
11db0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11dc0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
11dd0 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
11de0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
11df0 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
11e00 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11e10 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
11e20 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11e30 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
11e40 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
11e50 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11e60 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11e70 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
11e80 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
11e90 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11ea0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11eb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
11ec0 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
11ed0 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
11ee0 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
11ef0 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
11f00 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
11f10 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
11f20 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
11f30 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
11f40 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
11f50 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
11f60 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
11f70 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
11f80 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
11f90 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
11fa0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11fc0 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
11fd0 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
11fe0 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11ff0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
12000 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
12010 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
12020 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
12030 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
12040 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
12050 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
12060 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
12070 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
12080 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
12090 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
120a0 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
120b0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
120c0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
120d0 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
120e0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
120f0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
12100 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
12110 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
12120 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
12130 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
12140 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
12150 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
12160 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
12170 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
12180 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12190 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
121a0 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
121b0 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
121c0 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
121d0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
121e0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
121f0 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
12200 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
12210 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
12220 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
12230 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
12240 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12250 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
12260 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
12270 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
12280 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
12290 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
122a0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
122b0 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
122c0 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
122d0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
122e0 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
122f0 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
12300 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12310 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
12320 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12330 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
12340 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
12350 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
12360 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
12370 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
12380 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
12390 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
123a0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
123b0 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
123c0 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
123d0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
123e0 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
123f0 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
12400 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
12410 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
12420 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12430 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
12440 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
12450 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
12460 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
12470 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
12480 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
12490 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
124a0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
124b0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
124c0 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
124d0 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
124e0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
124f0 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
12500 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12510 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
12520 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
12530 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
12540 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
12550 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
12560 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
12570 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
12580 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
12590 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
125a0 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
125b0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
125c0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
125d0 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
125e0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
125f0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12600 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12610 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12620 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
12630 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
12640 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
12650 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
12660 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
12670 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
12680 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
12690 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
126a0 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
126b0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
126c0 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
126d0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
126e0 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
126f0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
12700 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12710 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12720 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12730 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12740 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
12750 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12760 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
12770 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
12780 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
12790 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
127a0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
127b0 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
127c0 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
127d0 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
127e0 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
127f0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
12800 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
12810 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
12870 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
12880 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
12890 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
128a0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
128b0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
128c0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
128d0 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
128e0 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
128f0 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
12900 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
12910 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
12920 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
12930 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12940 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
12950 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
12960 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
12970 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
12980 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
12990 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
129a0 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
129b0 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
129c0 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
129d0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
129e0 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
12a00 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
12a10 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
12a20 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
12a30 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
12a40 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
12a50 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
12a60 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
12a70 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
12a80 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
12a90 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
12aa0 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
12ab0 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
12ac0 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
12ad0 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79   flags, 0, numBy
12ae0 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
12af0 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
12b00 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
12b10 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68  n osLockFile(*ph
12b20 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
12b30 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
12b40 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
12b70 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
12b80 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  ** Unlock a file
12b90 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61   region.. */.sta
12ba0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f  tic BOOL winUnlo
12bb0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
12bc0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
12bd0 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
12be0 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
12bf0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
12c00 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
12c10 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
12c20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12c30 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
12c40 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
12c50 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
12c60 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
12c70 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
12c80 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
12c90 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20  PI UnlockFile.. 
12ca0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
12cb0 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46  ceUnlockFile(phF
12cc0 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
12cd0 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20  offsetHigh,.    
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
12d00 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
12d10 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
12d20 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
12d30 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
12d40 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
12d50 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
12d60 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
12d70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
12d80 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
12d90 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
12da0 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
12db0 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  n osUnlockFileEx
12dc0 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d  (*phFile, 0, num
12dd0 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
12de0 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
12df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
12e00 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
12e10 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
12e20 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
12e30 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
12e60 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
12e70 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
12e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ec0 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
12ed0 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
12ee0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
12ef0 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
12f00 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
12f10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
12f20 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
12f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f70 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
12f80 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
12f90 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
12fa0 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
12fb0 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
12fc0 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
12fd0 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
12fe0 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
12ff0 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
13000 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
13010 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
13020 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
13030 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
13040 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  ed as the first.
13050 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  ** argument to o
13060 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69  ffset iOffset wi
13070 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  thin the file. I
13080 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
13090 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72  turn 0..** Other
130a0 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
130b0 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
130c0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
130d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
130e0 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c  nSeekFile(winFil
130f0 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
13100 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
13110 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
13120 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
13130 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
13140 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
13150 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
13160 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
13170 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
131a0 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
131b0 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
131c0 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
131d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
131e0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
131f0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
13200 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
13210 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
13220 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13230 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
13240 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f  tError() */..  O
13250 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
13260 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
13270 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
13280 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75   iOffset));..  u
13290 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
132a0 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
132b0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
132c0 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
132d0 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
132e0 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
132f0 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
13300 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
13310 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
13320 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20 2a  urns a dword.  *
13330 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
13340 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
13350 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
13360 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
13370 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
13380 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
13390 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
133a0 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
133b0 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a  ing to MSDN,.  *
133c0 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
133d0 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
133e0 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
133f0 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
13400 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20   determine.  ** 
13410 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
13420 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
13430 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
13440 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
13450 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73  call.  ** GetLas
13460 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
13470 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
13480 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
13490 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
134a0 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
134b0 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
134c0 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
134d0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
134e0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
134f0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
13500 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
13510 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
13520 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
13530 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
13540 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
13550 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
13560 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13580 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
13590 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
135a0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
135b0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
135c0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
135d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
135e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
135f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
13600 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
13610 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
13620 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
13630 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
13640 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
13650 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
13660 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
13670 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
13680 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
13690 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
136a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
136b0 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
136c0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
136f0 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
13700 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
13710 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
13720 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
13730 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
13740 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
13750 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
13760 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
13770 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13780 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
13790 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
137a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
137b0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
137c0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
137d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
137e0 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
137f0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
13800 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
13810 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13820 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
13830 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13840 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
13850 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
13860 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13870 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13880 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
13890 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
138a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
138b0 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
138c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
138d0 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
138e0 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
138f0 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
13900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13910 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
13920 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
13930 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
13940 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
13950 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
13960 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
13970 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
13980 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
13990 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
139a0 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
139b0 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
139c0 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
139d0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
139e0 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
139f0 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
13a00 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
13a10 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
13a20 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
13a30 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
13a40 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
13a50 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
13a60 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
13a70 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
13a80 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
13a90 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
13aa0 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
13ab0 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
13ac0 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
13ad0 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
13ae0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
13af0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
13b00 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
13b10 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
13b20 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
13b30 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
13b40 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
13b50 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
13b60 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
13b70 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
13b80 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
13b90 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
13ba0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
13bb0 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
13bc0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13bd0 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
13be0 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
13bf0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
13c00 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
13c10 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
13c20 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20  p, file=%p\n",. 
13c30 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13c40 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
13c50 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
13c60 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  >h));..#if SQLIT
13c70 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
13c80 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  0.  winUnmapfile
13c90 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
13ca0 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
13cb0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
13cc0 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
13cd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13ce0 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
13cf0 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
13d00 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
13d10 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
13d20 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
13d30 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  & (sqlite3_win32
13d40 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  _sleep(100), 1) 
13d50 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
13d60 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57  _WINCE.#define W
13d70 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
13d80 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65  TEMPTS 3.  wince
13d90 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c  DestroyLock(pFil
13da0 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e);.  if( pFile-
13db0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
13dc0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
13dd0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20   0;.    while(. 
13de0 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65            osDele
13df0 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a  teFileW(pFile->z
13e00 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d  DeleteOnClose)==
13e10 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73 47  0.        && osG
13e20 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
13e30 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
13e40 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66  OnClose)!=0xffff
13e50 66 66 66 66 0a 20 20 20 20 20 20 20 20 26 26 20  ffff.        && 
13e60 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45  cnt++ < WINCE_DE
13e70 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a  LETION_ATTEMPTS.
13e80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
13e90 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
13ea0 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74  p(100);  /* Wait
13eb0 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65   a little before
13ec0 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f   trying again */
13ed0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13ee0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a  e3_free(pFile->z
13ef0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a  DeleteOnClose);.
13f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
13f10 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
13f20 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
13f30 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
13f40 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  );.  OSTRACE(("C
13f50 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  LOSE pid=%lu, pF
13f60 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
13f70 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
13f80 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
13f90 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
13fa0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
13fb0 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
13fc0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
13fd0 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a   rc ? SQLITE_OK.
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69              : wi
13ff0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
14000 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73  _IOERR_CLOSE, os
14010 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c            "winCl
14040 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
14050 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
14060 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
14070 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
14080 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
14090 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
140a0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
140b0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
140c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
140d0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
140e0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
140f0 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
14100 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
14110 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
14120 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
14130 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
14140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14150 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
14160 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
14170 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
141a0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
141b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
141c0 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
141d0 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
141e0 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
141f0 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
14200 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
14210 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
14220 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
14230 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76  .  OVERLAPPED ov
14240 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
14250 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
14260 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a   for ReadFile. *
14270 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  /.#endif.  winFi
14280 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
14290 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
142a0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
142b0 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
142e0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
142f0 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69  from file */.  i
14300 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20  nt nRetry = 0;  
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14320 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72  * Number of retr
14330 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ys */..  assert(
14340 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
14350 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
14360 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
14370 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
14380 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
14390 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
143a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
143b0 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
143c0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75  =%p, file=%p, bu
143d0 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
143e0 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
143f0 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c   "offset=%lld, l
14400 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74  ock=%d\n", osGet
14410 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14420 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
14430 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
14440 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
14450 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
14460 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
14470 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14480 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
14490 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
144a0 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
144b0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
144c0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
144d0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
144e0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
144f0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
14500 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
14510 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
14520 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
14530 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
14540 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
14550 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
14560 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
14570 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
14580 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
14590 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50  RACE(("READ-MMAP
145a0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
145b0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
145c0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
145e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
145f0 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14600 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
14610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14630 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
14640 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
14650 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
14660 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
14670 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
14680 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
14690 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
146a0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
146b0 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
146c0 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
146d0 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
146e0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
146f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14700 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
14710 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  NCE || defined(S
14720 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
14730 56 45 52 4c 41 50 50 45 44 29 0a 20 20 69 66 28  VERLAPPED).  if(
14740 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
14750 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20  le, offset) ){. 
14760 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
14770 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14780 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14790 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
147a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
147b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
147c0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
147d0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
147e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
147f0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21  ;.  }.  while( !
14800 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
14810 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
14820 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65  &nRead, 0) ){.#e
14830 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  lse.  memset(&ov
14840 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
14850 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
14860 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
14870 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
14880 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
14890 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  ff);.  overlappe
148a0 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
148b0 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
148c0 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
148d0 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  ;.  while( !osRe
148e0 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
148f0 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
14900 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  ad, &overlapped)
14910 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47   &&.         osG
14920 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45  etLastError()!=E
14930 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20  RROR_HANDLE_EOF 
14940 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57  ){.#endif.    DW
14950 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
14960 20 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49     if( winRetryI
14970 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c  oerr(&nRetry, &l
14980 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74  astErrno) ) cont
14990 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d  inue;.    pFile-
149a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
149b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52  tErrno;.    OSTR
149c0 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
149d0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
149e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
149f0 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a  _IOERR_READ\n",.
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
14a10 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14a20 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14a30 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
14a40 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
14a50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
14a60 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  D, pFile->lastEr
14a70 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14a80 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14a90 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Read", pFile->zP
14aa0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c  ath);.  }.  winL
14ab0 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20  ogIoerr(nRetry, 
14ac0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28  __LINE__);.  if(
14ad0 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d   nRead<(DWORD)am
14ae0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65  t ){.    /* Unre
14af0 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
14b00 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
14b10 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
14b20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
14b30 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20  *)pBuf)[nRead], 
14b40 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20  0, amt-nRead);. 
14b50 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
14b60 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14b70 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14b80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
14b90 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20  ORT_READ\n",.   
14ba0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
14bb0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
14bc0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
14bd0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
14be0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
14bf0 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ORT_READ;.  }.. 
14c00 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
14c10 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14c20 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14c30 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
14c40 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
14c50 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
14c60 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
14c70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
14c80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14c90 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
14ca0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
14cb0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
14cc0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
14cd0 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
14ce0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
14cf0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
14d00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
14d10 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
14d20 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
14d30 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
14d40 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
14d50 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
14d60 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
14d70 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
14d80 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
14d90 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
14dc0 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
14dd0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
14de0 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
14df0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
14e00 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
14e10 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
14e20 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
14e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14e40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14e50 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
14e60 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
14e70 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
14e80 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
14e90 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
14ea0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  dle */.  int nRe
14eb0 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
14ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14ed0 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f  er of retries */
14ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ..  assert( amt>
14ef0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14f00 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
14f10 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
14f20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
14f30 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
14f40 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
14f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
14f60 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
14f70 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
14f80 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14f90 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
14fa0 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  unt=%d, ".      
14fb0 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c       "offset=%ll
14fc0 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f  d, lock=%d\n", o
14fd0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14fe0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
14ff0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15000 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
15010 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
15020 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 64  cktype));..#if d
15030 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d  efined(SQLITE_MM
15040 41 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26  AP_READWRITE) &&
15050 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
15060 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
15070 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
15080 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
15090 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
150a0 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
150b0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
150c0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
150d0 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
150e0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
150f0 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
15100 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
15110 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
15120 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
15130 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
15140 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
15150 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
15160 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
15170 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
15180 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75  ITE-MMAP pid=%lu
15190 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
151a0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
151b0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
151c0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
151d0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
151e0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
151f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
15210 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
15220 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
15230 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
15240 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
15250 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
15260 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
15270 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
15280 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
15290 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
152a0 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
152b0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
152c0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
152d0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
152e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
152f0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64  TE_OS_WINCE || d
15300 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
15310 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
15320 44 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65  D).  rc = winSee
15330 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
15340 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
15350 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23  0 ){.#else.  {.#
15360 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
15370 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
15380 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
15390 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
153a0 44 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  D).    OVERLAPPE
153b0 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
153c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
153d0 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
153e0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
153f0 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
15400 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
15410 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
15420 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
15430 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15450 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15460 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
15470 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
15480 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
15490 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
154a0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
154b0 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
154c0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
154d0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
154e0 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
154f0 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
15500 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
15510 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
15520 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
15530 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
15540 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d  VERLAPPED).    m
15550 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
15560 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
15570 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
15580 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
15590 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
155a0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
155b0 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
155c0 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
155d0 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
155e0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
155f0 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65  endif..    while
15600 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20  ( nRem>0 ){.#if 
15610 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15620 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15630 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
15640 41 50 50 45 44 29 0a 20 20 20 20 20 20 69 66 28  APPED).      if(
15650 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
15660 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
15670 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
15680 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
15690 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
156a0 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
156b0 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
156c0 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
156d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
156e0 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
156f0 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72  &nRetry, &lastEr
15700 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rno) ) continue;
15710 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
15730 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20  sert( nWrite==0 
15740 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52  || nWrite<=(DWOR
15750 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20  D)nRem );.      
15760 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  if( nWrite==0 ||
15770 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e   nWrite>(DWORD)n
15780 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Rem ){.        l
15790 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
157a0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
157b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
157c0 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
157d0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
157e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
157f0 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
15800 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
15810 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
15820 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
15830 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
15840 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
15850 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
15860 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
15870 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
15880 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
15890 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
158a0 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
158b0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
158c0 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
158d0 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
158e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
158f0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
15900 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
15910 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
15920 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
15930 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15940 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
15950 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
15960 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
15970 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
15980 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
15990 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
159a0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ITE pid=%lu, pFi
159b0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
159c0 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
159d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
159e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
159f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15a00 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15a10 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
15a20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55  gError(SQLITE_FU
15a30 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  LL, pFile->lastE
15a40 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15a60 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c  winWrite1", pFil
15a70 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
15a80 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57  .    OSTRACE(("W
15a90 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  RITE pid=%lu, pF
15aa0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
15ab0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
15ac0 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20  _WRITE\n",.     
15ad0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15ae0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15af0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15b00 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
15b10 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15b20 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
15b30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
15b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15b50 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
15b60 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
15b70 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
15b80 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
15b90 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  try, __LINE__);.
15ba0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
15bb0 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
15bc0 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15bd0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
15be0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
15bf0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15c00 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15c10 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
15c20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15c30 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
15c40 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
15c50 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
15c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15c70 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
15c80 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
15c90 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
15ca0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
15cb0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
15cc0 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
15cd0 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
15ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15cf0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
15d00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
15d10 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
15d20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
15d30 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  Errno;..  assert
15d40 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
15d50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
15d60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15d70 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53  _TRUNCATE);.  OS
15d80 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
15d90 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
15da0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a  %p, file=%p, siz
15db0 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c  e=%lld, lock=%d\
15dc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
15dd0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15de0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15df0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
15e00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
15e10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15e20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
15e30 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
15e40 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
15e50 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
15e60 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
15e70 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
15e80 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
15e90 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
15ea0 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
15eb0 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
15ec0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
15ed0 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
15ee0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
15ef0 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
15f00 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
15f10 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
15f20 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
15f30 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
15f40 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
15f50 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
15f60 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hunk;.  }..  /* 
15f70 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72  SetEndOfFile() r
15f80 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
15f90 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c  when successful,
15fa0 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74   or zero when it
15fb0 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28   fails. */.  if(
15fc0 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
15fd0 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  le, nByte) ){.  
15fe0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
15ff0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
16000 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
16010 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c   "winTruncate1",
16040 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16050 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f    }else if( 0==o
16060 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46  sSetEndOfFile(pF
16070 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20  ile->h) &&.     
16080 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72         ((lastErr
16090 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
160a0 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53  ror())!=ERROR_US
160b0 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20  ER_MAPPED_FILE) 
160c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
160d0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
160e0 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  rno;.    rc = wi
160f0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
16100 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
16110 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16120 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
16130 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
16140 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate2", pFile->z
16150 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  Path);.  }..#if 
16160 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16170 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74  SIZE>0.  /* If t
16180 68 65 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e  he file was trun
16190 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
161a0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
161b0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
161c0 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72  mapped region, r
161d0 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
161e0 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  ive mapping size
161f0 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65   as well. SQLite
16200 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72   will.  ** use r
16210 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28  ead() and write(
16220 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  ) to access data
16230 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69   beyond this poi
16240 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a  nt from now on..
16250 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
16260 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20  ->pMapRegion && 
16270 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
16280 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69  pSize ){.    pFi
16290 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
162a0 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Byte;.  }.#endif
162b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ..  OSTRACE(("TR
162c0 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  UNCATE pid=%lu, 
162d0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
162e0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
162f0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16300 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16310 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16320 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16330 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
16340 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
16350 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
16360 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
16370 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
16380 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
16390 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
163a0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
163b0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
163c0 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
163d0 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
163e0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
163f0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
16400 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
16410 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
16420 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
16430 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
16440 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
16450 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
16460 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
16470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16480 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
16490 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
164a0 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
164b0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
164c0 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
164d0 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
164e0 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
164f0 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
16500 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
16510 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
16520 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
16530 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
16540 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53   \.    defined(S
16550 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
16560 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  ACE).  /*.  ** U
16570 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
16580 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
16590 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
165a0 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
165b0 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
165c0 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
165d0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
165e0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
165f0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
16600 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
16610 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
16620 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
16630 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
16640 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
16650 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
16660 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
16670 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
16680 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
16690 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
166a0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
166b0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
166c0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
166d0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
166e0 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
166f0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
16700 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
16710 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
16720 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
16730 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
16740 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
16750 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
16760 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
16770 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
16780 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16790 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
167a0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61  %p, file=%p, fla
167b0 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  gs=%x, lock=%d\n
167c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
167d0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
167e0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
167f0 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20  ile->h, flags,. 
16800 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16810 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
16820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  fndef SQLITE_TES
16830 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  T.  UNUSED_PARAM
16840 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c  ETER(flags);.#el
16850 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26  se.  if( (flags&
16860 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
16870 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
16880 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
16890 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
168a0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
168b0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
168c0 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
168d0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
168e0 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
168f0 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
16900 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
16910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
16920 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45  O_SYNC.  OSTRACE
16930 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d  (("SYNC-NOP pid=
16940 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
16950 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
16960 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
16970 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
16980 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
16990 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
169a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
169b0 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53 51  OK;.#else.#if SQ
169c0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
169d0 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65  ZE>0.  if( pFile
169e0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
169f0 20 20 20 20 69 66 28 20 6f 73 46 6c 75 73 68 56      if( osFlushV
16a00 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
16a10 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29 20  >pMapRegion, 0) 
16a20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
16a30 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64  (("SYNC-MMAP pid
16a40 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16a50 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
16a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a70 22 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22  "rc=SQLITE_OK\n"
16a80 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
16a90 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20  ocessId(),.     
16aa0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c            pFile,
16ab0 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
16ac0 6f 6e 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  on));.    }else{
16ad0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
16ae0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
16af0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
16b00 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16b10 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  -MMAP pid=%lu, p
16b20 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
16b30 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
16b40 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
16b50 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
16b60 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
16b70 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20  rocessId(),.    
16b80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16b90 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
16ba0 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
16bb0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
16bc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
16bd0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
16be0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16c00 69 6e 53 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d  inSync1", pFile-
16c10 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
16c20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d   }.#endif.  rc =
16c30 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
16c40 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
16c50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16c60 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
16c70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53  if( rc ){.    OS
16c80 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64  TRACE(("SYNC pid
16c90 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16ca0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16cb0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
16cc0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16cd0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16ce0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
16cf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
16d10 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
16d20 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16d30 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f  stError();.    O
16d40 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69  STRACE(("SYNC pi
16d50 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16d60 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16d70 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c  ITE_IOERR_FSYNC\
16d80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
16d90 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16da0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16db0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16dc0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16dd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16de0 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
16df0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 22 77 69 6e 53 79 6e 63 32 22 2c 20 70 46 69   "winSync2", pFi
16e20 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
16e30 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
16e40 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
16e50 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
16e60 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
16e70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
16e80 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
16e90 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
16ea0 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
16eb0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16ec0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16ed0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16ee0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
16ef0 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
16f00 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
16f10 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
16f20 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
16f30 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
16f40 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
16f50 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
16f60 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
16f70 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
16f80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
16f90 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
16fa0 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
16fb0 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
16fc0 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
16fd0 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
16fe0 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
16ff0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
17020 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
17030 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
17040 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
17050 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
17060 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
17070 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17080 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
17090 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
170a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
170b0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
170c0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
170f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17100 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
17110 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
17120 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
17130 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
17140 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
17150 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
17160 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
17170 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
17180 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
17190 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
171a0 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
171b0 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
171c0 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
171d0 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
171e0 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
171f0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
17200 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
17210 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
17220 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
17230 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17240 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
17250 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
17260 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
17270 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
17280 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
172a0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
172b0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
172c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
172d0 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
172e0 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
172f0 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72  , *pSize=%lld, r
17300 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
17310 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53      pFile->h, pS
17320 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c  ize, *pSize, sql
17330 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
17340 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17350 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
17360 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
17370 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
17380 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
17390 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
173a0 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
173b0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
173c0 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
173d0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
173e0 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   1.#endif..#ifnd
173f0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ef LOCKFILE_EXCL
17400 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66  USIVE_LOCK.# def
17410 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  ine LOCKFILE_EXC
17420 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65  LUSIVE_LOCK 2.#e
17430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74  ndif../*.** Hist
17440 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65  orically, SQLite
17450 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74   has used both t
17460 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20  he LockFile and 
17470 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
17480 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  ions..** When th
17490 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74  e LockFile funct
174a0 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74  ion was used, it
174b0 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65   was always expe
174c0 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20  cted to fail.** 
174d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
174e0 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  he lock could no
174f0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20  t be obtained.  
17500 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20  Also, it always 
17510 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f  expected to.** o
17520 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
17530 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20  ve lock.  These 
17540 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77  flags are used w
17550 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  ith the LockFile
17560 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  Ex function.** a
17570 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65  nd reflect those
17580 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74   expectations; t
17590 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73  herefore, they s
175a0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61  hould not be cha
175b0 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nged..*/.#ifndef
175c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
175d0 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
175e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
175f0 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c  FLAGS   (LOCKFIL
17600 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
17610 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20  LY | \.         
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c           LOCKFIL
17640 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
17650 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
17660 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74  Currently, SQLit
17670 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68  e never calls th
17680 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
17690 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61  ction without wa
176a0 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c  nting the.** cal
176b0 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69  l to fail immedi
176c0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
176d0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
176e0 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
176f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17700 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  EX_FLAGS.# defin
17710 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
17720 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46  EEX_FLAGS (LOCKF
17730 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
17740 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TELY).#endif../*
17750 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
17760 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
17770 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
17780 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
17790 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
177a0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
177b0 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20  .** is Win9x or 
177c0 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
177d0 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c   int winGetReadL
177e0 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
177f0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
17800 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
17810 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
17820 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
17830 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17840 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
17850 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
17860 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
17870 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
17880 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
17890 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
178a0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
178b0 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
178c0 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
178d0 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
178e0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
178f0 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
17900 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
17910 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
17920 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
17930 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
17940 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
17950 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
17960 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17970 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17980 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17990 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
179a0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
179b0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
179c0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
179d0 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
179e0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
179f0 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
17a00 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
17a10 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
17a20 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
17a30 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
17a40 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
17a50 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
17a60 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
17a70 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
17a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a90 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17aa0 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
17ab0 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
17ac0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
17ad0 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
17ae0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
17af0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17b00 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
17b10 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
17b20 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
17b30 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52  ck */.  }.  OSTR
17b40 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
17b50 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
17b60 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
17b70 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e   res));.  return
17b80 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
17b90 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
17ba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17bb0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
17bc0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
17bd0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
17be0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
17bf0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
17c00 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
17c10 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
17c20 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17c30 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
17c40 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
17c50 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
17c60 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
17c70 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
17c80 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
17c90 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
17ca0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
17cb0 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
17cc0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
17cd0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
17ce0 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
17cf0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
17d00 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
17d10 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
17d20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
17d30 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
17d40 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
17d50 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
17d60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
17d70 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
17d80 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
17d90 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
17da0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17db0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
17dc0 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61     "winUnlockRea
17dd0 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
17de0 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  Path);.  }.  OST
17df0 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f  RACE(("READ-UNLO
17e00 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
17e10 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
17e20 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
17e30 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
17e40 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
17e50 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
17e60 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
17e70 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
17e80 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
17e90 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
17ea0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
17eb0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
17ec0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
17ed0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
17ee0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
17ef0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
17f00 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
17f10 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
17f20 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
17f30 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
17f40 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
17f50 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
17f60 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
17f70 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
17f80 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
17f90 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
17fa0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
17fb0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
17fc0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
17fd0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
17fe0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
17ff0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
18000 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
18010 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
18020 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
18030 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
18040 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
18050 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
18060 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
18070 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
18080 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
18090 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
180a0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
180b0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
180c0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
180d0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
180e0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
180f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18100 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
18110 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
18120 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75   winUnlock() rou
18130 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61  tine.** erases a
18140 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65  ll locks at once
18150 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20   and returns us 
18160 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c  immediately to l
18170 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
18180 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
18190 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74  sible to lower t
181a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
181b0 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74   one step at a t
181c0 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73  ime.  You.** mus
181d0 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f  t go straight to
181e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
181f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18200 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  winLock(sqlite3_
18210 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
18220 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
18230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
18240 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18250 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
18260 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  s */.  int res =
18270 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
18280 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e   Result of a Win
18290 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a  dows lock call *
182a0 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74  /.  int newLockt
182b0 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ype;       /* Se
182c0 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  t pFile->locktyp
182d0 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
182e0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
182f0 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
18300 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
18310 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
18320 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
18330 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
18340 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
18350 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
18360 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
18370 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20   = NO_ERROR;..  
18380 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
18390 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
183a0 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
183b0 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
183c0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
183d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
183e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
183f0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
18400 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
18410 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
18420 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
18430 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
18440 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
18450 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
18460 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
18470 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
18480 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
18490 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
184a0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
184b0 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
184c0 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
184d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
184e0 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
184f0 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
18500 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69  E(("LOCK-HELD fi
18510 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18520 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18530 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
18540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
18550 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
18560 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72 69   any kind of wri
18570 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61  te-lock on a rea
18580 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a  d-only database.
18590 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
185a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  e->ctrlFlags & W
185b0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d  INFILE_RDONLY)!=
185c0 30 20 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52  0 && locktype>=R
185d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
185e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
185f0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
18600 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
18610 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
18620 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
18630 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
18640 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18650 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
18660 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
18670 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18680 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
18690 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
186a0 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
186b0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
186c0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
186d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
186e0 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
186f0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
18700 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
18710 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
18720 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
18730 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
18740 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
18750 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
18760 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
18770 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
18780 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
18790 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
187a0 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
187b0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
187c0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
187d0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
187e0 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65  .   || (locktype
187f0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18800 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
18810 79 70 65 3c 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype<=RESERVED_LO
18820 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
18830 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
18840 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
18850 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69  (res = winLockFi
18860 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
18870 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
18880 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
188b0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
188c0 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
188d0 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
188e0 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
188f0 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20  ing lock.  This 
18900 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72  is needed to wor
18910 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e  k.      ** aroun
18920 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
18930 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e  d by indexing an
18940 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20  d/or anti-virus 
18950 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20  software on.    
18960 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73    ** Windows sys
18970 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tems..      ** I
18980 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  f you are using 
18990 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d  this code as a m
189a0 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61  odel for alterna
189b0 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e  tive VFSes, do n
189c0 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  ot.      ** copy
189d0 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69   this retry logi
189e0 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b  c.  It is a hack
189f0 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69   intended for Wi
18a00 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20  ndows only..    
18a10 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45    */.      lastE
18a20 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18a30 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
18a40 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45  STRACE(("LOCK-PE
18a50 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d  NDING-FAIL file=
18a60 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65  %p, count=%d, re
18a70 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  sult=%d\n",.    
18a80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18a90 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b  ->h, cnt, res));
18aa0 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
18ab0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41  rrno==ERROR_INVA
18ac0 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20  LID_HANDLE ){.  
18ad0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
18ae0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
18af0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
18b00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
18b10 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  CK;.        OSTR
18b20 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20  ACE(("LOCK-FAIL 
18b30 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
18b40 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
18b60 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c  ile->h, cnt, sql
18b70 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
18b80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
18b90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18ba0 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71      if( cnt ) sq
18bb0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
18bc0 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
18bd0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
18be0 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72   res;.    if( !r
18bf0 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  es ){.      last
18c00 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
18c10 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
18c20 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
18c30 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
18c40 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
18c50 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
18c60 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
18c70 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
18c80 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
18c90 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
18ca0 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
18cb0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  e);.    if( res 
18cc0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
18cd0 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
18ce0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
18cf0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
18d00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
18d10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18d20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
18d30 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  ERVED lock.  */.
18d40 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
18d50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
18d60 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
18d70 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
18d80 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
18d90 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
18da0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
18db0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
18dc0 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45  FILE_FLAGS, RESE
18dd0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
18de0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
18df0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
18e00 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
18e10 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
18e20 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
18e30 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
18e40 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
18e50 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
18e60 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
18e70 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
18e80 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18e90 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
18ea0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
18eb0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
18ec0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
18ed0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
18ee0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
18ef0 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
18f00 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
18f10 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
18f20 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
18f30 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18f40 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
18f50 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
18f60 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
18f70 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  le);.    res = w
18f80 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
18f90 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
18fa0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41  KFILE_FLAGS, SHA
18fb0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
18fe0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
18ff0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
19000 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
19010 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
19020 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
19030 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
19040 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
19050 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
19060 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
19070 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f   /* If we are ho
19080 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20  lding a PENDING 
19090 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20  lock that ought 
190a0 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20  to be released, 
190b0 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73  then.  ** releas
190c0 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
190d0 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c   if( gotPendingL
190e0 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  ock && locktype=
190f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
19100 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
19110 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
19120 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
19130 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55   0);.  }..  /* U
19140 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
19150 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
19160 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
19170 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
19180 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
19190 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
191a0 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
191b0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
191c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
191d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
191e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
191f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
19200 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
19210 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
19220 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70  OCK-FAIL file=%p
19230 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74  , wanted=%d, got
19240 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
19250 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
19260 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b  ocktype, newLock
19270 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46  type));.  }.  pF
19280 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
19290 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  (u8)newLocktype;
192a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
192b0 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
192c0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
192d0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
192e0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
192f0 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  pe, sqlite3ErrNa
19300 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
19310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19320 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
19330 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
19340 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
19350 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
19360 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
19370 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
19380 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
19390 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
193a0 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
193b0 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
193c0 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
193d0 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
193e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
193f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19400 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
19410 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65  t res;.  winFile
19420 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
19430 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
19440 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
19450 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19460 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
19470 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  K; );.  OSTRACE(
19480 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
19490 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
194a0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
194b0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61   pResOut));..  a
194c0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
194d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
194e0 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
194f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20  LOCK ){.    res 
19500 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  = 1;.    OSTRACE
19510 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
19520 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
19530 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
19540 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
19550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73    }else{.    res
19560 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
19570 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
19580 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
19590 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  S,RESERVED_BYTE,
195a0 30 2c 31 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  0,1,0);.    if( 
195b0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  res ){.      win
195c0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
195d0 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
195e0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
195f0 20 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21     }.    res = !
19600 72 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  res;.    OSTRACE
19610 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
19620 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
19630 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
19640 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b  pFile->h, res));
19650 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
19660 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45  = res;.  OSTRACE
19670 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
19680 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74  file=%p, pResOut
19690 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64  =%p, *pResOut=%d
196a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
196b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
196c0 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c  ile->h, pResOut,
196d0 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72   *pResOut));.  r
196e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
196f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
19700 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
19710 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
19720 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
19730 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
19740 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
19750 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
19760 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
19770 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
19780 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
19790 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
197a0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
197b0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
197c0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
197d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
197e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
197f0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
19800 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
19810 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
19820 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19830 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
19840 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
19850 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
19860 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
19870 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
19880 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
19890 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
198a0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
198b0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
198c0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
198d0 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  ){.  int type;. 
198e0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
198f0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
19900 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19910 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
19920 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  pFile!=0 );.  as
19930 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
19940 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
19950 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
19960 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
19970 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
19980 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
19990 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
199a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
199b0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
199c0 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
199d0 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c  );.  type = pFil
199e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
199f0 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49  f( type>=EXCLUSI
19a00 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  VE_LOCK ){.    w
19a10 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
19a20 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
19a30 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
19a40 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
19a50 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
19a60 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47  ED_LOCK && !winG
19a70 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
19a80 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
19a90 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
19aa0 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75  happen.  We shou
19ab0 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c  ld always be abl
19ac0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  e to.      ** re
19ad0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
19ae0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
19af0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
19b00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
19b10 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OCK, osGetLastEr
19b20 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
19b40 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
19b50 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
19b60 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
19b70 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
19b80 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
19b90 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
19ba0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
19bb0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
19bc0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
19bd0 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
19be0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
19bf0 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
19c00 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
19c10 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
19c20 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
19c30 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
19c40 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
19c50 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
19c60 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
19c70 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
19c80 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
19c90 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
19ca0 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
19cb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
19cc0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
19cd0 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
19ce0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
19cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19d00 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
19d10 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
19d20 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
19d30 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
19d40 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
19d50 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
19d60 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
19d70 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
19d80 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
19d90 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
19da0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
19db0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
19dc0 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
19dd0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
19de0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19df0 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
19e00 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
19e10 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
19e20 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
19e30 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
19e40 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
19e50 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
19e60 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
19e70 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
19e80 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
19e90 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
19ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
19eb0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
19ec0 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
19ed0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
19ee0 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
19ef0 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
19f00 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
19f10 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
19f20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73  winGetTempname(s
19f30 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68  qlite3_vfs *, ch
19f40 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69  ar **);.static i
19f50 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
19f60 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  t void *);.stati
19f70 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76  c BOOL winIsDriv
19f80 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
19f90 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
19fa0 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e  /*.** Control an
19fb0 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f  d query of the o
19fc0 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
19fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19fe0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  inFileControl(sq
19ff0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a000 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1a010 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  rg){.  winFile *
1a020 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
1a030 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28  *)id;.  OSTRACE(
1a040 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a050 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c   op=%d, pArg=%p\
1a060 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70  n", pFile->h, op
1a070 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74  , pArg));.  swit
1a080 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1a090 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1a0a0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1a0b0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1a0c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
1a0d0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1a0e0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a0f0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1a100 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1a110 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a120 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1a130 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1a140 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  L_LAST_ERRNO: {.
1a150 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1a160 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
1a170 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1a180 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a190 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1a1a0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1a1b0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1a1c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a1d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1a1e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1a1f0 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1a200 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1a210 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1a220 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1a230 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1a240 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1a250 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1a260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a280 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1a290 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
1a2a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1a2b0 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unk>0 ){.       
1a2c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1a2d0 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  ldSz;.        in
1a2e0 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69  t rc = winFileSi
1a2f0 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a  ze(id, &oldSz);.
1a300 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1a310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
1a330 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73  nt64 newSz = *(s
1a340 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41  qlite3_int64*)pA
1a350 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rg;.          if
1a360 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b  ( newSz>oldSz ){
1a370 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
1a380 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a390 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(1);.         
1a3a0 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
1a3b0 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a  ate(id, newSz);.
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
1a3d0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a3e0 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(0);.          
1a3f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1a400 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1a410 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1a420 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
1a430 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1a440 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
1a450 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a460 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
1a470 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a480 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1a490 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1a4a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a4b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1a4c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1a4d0 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1a4e0 0a 20 20 20 20 20 20 69 6e 74 20 62 50 65 72 73  .      int bPers
1a4f0 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72  ist = *(int*)pAr
1a500 67 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 65  g;.      if( bPe
1a510 72 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20  rsist<0 ){.     
1a520 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1a530 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74   pFile->bPersist
1a540 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Wal;.      }else
1a550 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
1a560 3e 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20 62  >bPersistWal = b
1a570 50 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20 20  Persist!=0;.    
1a580 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1a590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a5a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1a5b0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
1a5c0 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
1a5d0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
1a5e0 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
1a5f0 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
1a600 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1a610 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1a620 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1a630 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1a640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a650 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1a660 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1a670 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a680 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
1a690 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
1a6a0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
1a6b0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1a6c0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a6d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1a6e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1a6f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1a700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a710 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1a720 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1a730 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1a740 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1a750 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1a760 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1a770 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54  Name);.      OST
1a780 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1a790 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1a7a0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1a7b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a7c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1a7d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1a7e0 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
1a7f0 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69  RETRY: {.      i
1a800 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41  nt *a = (int*)pA
1a810 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  rg;.      if( a[
1a820 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0]>0 ){.        
1a830 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
1a840 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
1a850 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
1a860 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b  = winIoerrRetry;
1a870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a880 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
1a890 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
1a8a0 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
1a8b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a8c0 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49       a[1] = winI
1a8d0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
1a8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1a8f0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a900 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1a910 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1a920 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1a930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a940 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1a950 54 45 53 54 0a 20 20 20 20 63 61 73 65 20 53 51  TEST.    case SQ
1a960 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
1a970 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20  _SET_HANDLE: {. 
1a980 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68       LPHANDLE ph
1a990 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45  File = (LPHANDLE
1a9a0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e  )pArg;.      HAN
1a9b0 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70  DLE hOldFile = p
1a9c0 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70  File->h;.      p
1a9d0 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c  File->h = *phFil
1a9e0 65 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65  e;.      *phFile
1a9f0 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20   = hOldFile;.   
1aa00 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1aa10 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e  TL oldFile=%p, n
1aa20 65 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  ewFile=%p, rc=SQ
1aa30 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
1aa40 20 20 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46             hOldF
1aa50 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
1aa60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1aa70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1aa80 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53  endif.    case S
1aa90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
1aaa0 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
1aab0 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
1aac0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   0;.      int rc
1aad0 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d   = winGetTempnam
1aae0 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26  e(pFile->pVfs, &
1aaf0 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  zTFile);.      i
1ab00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ab10 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68   ){.        *(ch
1ab20 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
1ab30 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
1ab40 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1ab50 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
1ab60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
1ab70 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1ab80 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
1ab90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20  n rc;.    }.#if 
1aba0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1abb0 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
1abc0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
1abd0 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
1abe0 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
1abf0 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
1ac00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ac10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
1ac20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
1ac30 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
1ac40 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
1ac50 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
1ac60 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1ac70 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mmap;.      }.  
1ac80 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
1ac90 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1aca0 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
1acb0 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
1acc0 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
1acd0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
1ace0 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
1acf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1ad00 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1ad10 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
1ad20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
1ad30 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1ad40 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70          winUnmap
1ad50 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
1ad60 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d         rc = winM
1ad70 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
1ad80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ad90 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1ada0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1adb0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
1adc0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
1add0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1ade0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1adf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1ae00 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1ae10 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1ae20 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22  LITE_NOTFOUND\n"
1ae30 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1ae40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ae50 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1ae60 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1ae70 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1ae80 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1ae90 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1aea0 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1aeb0 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1aec0 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1aed0 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1aee0 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1aef0 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1af00 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1af10 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1af20 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1af30 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1af40 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1af50 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1af60 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1af70 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1af80 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1af90 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1afa0 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1afb0 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1afc0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1afd0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1afe0 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
1aff0 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
1b000 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1b010 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69   *id){.  (void)i
1b020 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1b030 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1b040 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
1b050 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72   Return a vector
1b060 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61   of device chara
1b070 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73  cteristics..*/.s
1b080 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76  tatic int winDev
1b090 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1b0a0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1b0b0 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  *id){.  winFile 
1b0c0 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  *p = (winFile*)i
1b0d0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1b0e0 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
1b0f0 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c  ABLE_WHEN_OPEN |
1b100 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63  .         ((p->c
1b110 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
1b120 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f  LE_PSOW)?SQLITE_
1b130 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1b140 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a  OVERWRITE:0);.}.
1b150 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  ./*.** Windows w
1b160 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
1b170 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
1b180 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
1b190 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
1b1a0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
1b1b0 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
1b1c0 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
1b1d0 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
1b1e0 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
1b1f0 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
1b200 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
1b210 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e  static SYSTEM_IN
1b220 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
1b230 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b240 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
1b250 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
1b260 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
1b270 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
1b280 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
1b290 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
1b2a0 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
1b2b0 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
1b2c0 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
1b2d0 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20  y.** this file, 
1b2e0 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
1b2f0 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
1b300 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
1b310 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
1b320 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1b330 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
1b340 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
1b350 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73  obal mutex.** is
1b360 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
1b370 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
1b380 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
1b390 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1b3a0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
1b3b0 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
1b3c0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1b3d0 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
1b3e0 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
1b3f0 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
1b400 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
1b410 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1b420 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
1b430 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
1b440 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
1b450 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1b460 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1b470 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61 74  C_VFS1));.}.stat
1b480 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65  ic void winShmLe
1b490 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
1b4a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b4b0 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74  leave(sqlite3Mut
1b4c0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1b4d0 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
1b4e0 29 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ));.}.#ifndef ND
1b4f0 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
1b500 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1b510 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
1b520 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b530 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
1b540 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1b550 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29  EX_STATIC_VFS1))
1b560 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1b570 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
1b580 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e   represent a sin
1b590 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  gle file opened 
1b5a0 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70  and mmapped to p
1b5b0 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64  rovide.** shared
1b5c0 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d   memory.  When m
1b5d0 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
1b5e0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
1b5f0 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75  e same.** log-su
1b600 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65  mmary, each thre
1b610 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77  ad has its own w
1b620 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62  inFile object, b
1b630 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70  ut they all.** p
1b640 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
1b650 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1b660 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  s object.  In ot
1b670 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a  her words, each.
1b680 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69  ** log-summary i
1b690 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e  s opened only on
1b6a0 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
1b6b0 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65  **.** winShmMute
1b6c0 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
1b6d0 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
1b6e0 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
1b6f0 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
1b700 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
1b710 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
1b720 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
1b730 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
1b740 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 0a  f.**      pNext.
1b750 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1b760 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
1b770 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
1b780 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
1b790 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ated:.**.**     
1b7a0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
1b7b0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
1b7c0 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
1b7d0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
1b7e0 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
1b7f0 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
1b800 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1b810 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
1b820 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b830 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
1b840 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
1b850 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
1b860 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
1b870 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b880 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
1b890 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
1b8a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1b8b0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1b8c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1b8d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b8e0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
1b8f0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
1b900 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
1b910 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
1b920 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b940 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
1b950 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
1b960 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b980 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
1b990 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
1b9a0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
1b9b0 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
1b9c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b9d0 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
1b9e0 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
1b9f0 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
1ba00 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
1ba10 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
1ba20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
1ba30 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
1ba40 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
1ba50 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
1ba60 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
1ba90 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1baa0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1bab0 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
1bac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1bad0 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
1bae0 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1baf0 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
1bb00 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
1bb10 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
1bb20 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
1bb30 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
1bb40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1bb50 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1bb60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
1bb70 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38  E_OS_TRACE).  u8
1bb80 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
1bb90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1bba0 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68   available winSh
1bbb0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
1bbc0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
1bbd0 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66   global array of
1bbe0 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
1bbf0 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  objects..**.** T
1bc00 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  he winShmMutexHe
1bc10 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
1bc20 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  e while reading 
1bc30 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  or writing this 
1bc40 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1bc50 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53  winShmNode *winS
1bc60 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  hmNodeList = 0;.
1bc70 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
1bc80 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
1bc90 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20   by this VFS to 
1bca0 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65  record the state
1bcb0 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73   of an.** open s
1bcc0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e  hared memory con
1bcd0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  nection..**.** T
1bce0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1bcf0 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  lds are initiali
1bd00 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62  zed when this ob
1bd10 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
1bd20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d  and.** are read-
1bd30 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a  only thereafter:
1bd40 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  .**.**    winShm
1bd50 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20  .pShmNode.**    
1bd60 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20  winShm.id.**.** 
1bd70 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73  All other fields
1bd80 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e   are read/write.
1bd90 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68    The winShm.pSh
1bda0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73  mNode->mutex mus
1bdb0 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
1bdc0 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
1bdd0 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
1bde0 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ds..*/.struct wi
1bdf0 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e  nShm {.  winShmN
1be00 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
1be10 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
1be20 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  lying winShmNode
1be30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e   object */.  win
1be40 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  Shm *pNext;     
1be50 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1be60 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20  winShm with the 
1be70 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20  same winShmNode 
1be80 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
1be90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bea0 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
1beb0 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  ng the winShmNod
1bec0 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36  e mutex */.  u16
1bed0 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
1bee0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1bef0 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
1bf00 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78  held */.  u16 ex
1bf10 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
1bf20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1bf30 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1bf40 68 65 6c 64 20 2a 2f 0a 23 69 66 20 64 65 66 69  held */.#if defi
1bf50 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1bf60 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1bf70 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
1bf80 45 29 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  E).  u8 id;     
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
1bfb0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
1bfc0 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
1bfd0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
1bfe0 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
1bff0 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
1c000 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
1c010 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
1c020 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
1c030 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
1c040 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
1c050 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
1c060 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
1c070 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
1c080 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
1c090 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
1c0a0 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
1c0b0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
1c0c0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
1c0d0 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
1c0e0 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
1c0f0 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
1c100 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
1c110 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
1c120 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
1c130 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
1c140 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
1c150 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
1c160 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
1c170 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
1c180 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
1c190 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
1c1a0 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
1c1b0 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
1c1c0 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
1c1d0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
1c1e0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
1c1f0 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
1c200 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
1c210 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c230 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1c240 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
1c250 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
1c260 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c270 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1c280 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
1c290 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
1c2a0 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
1c2b0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1c2c0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
1c2d0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
1c2e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c2f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
1c300 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
1c310 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
1c320 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1c330 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
1c340 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25  ock=%d, offset=%
1c350 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20  d, size=%d\n",. 
1c360 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1c370 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79  >hFile.h, lockTy
1c380 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65 29  pe, ofst, nByte)
1c390 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
1c3a0 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73  /Acquire the sys
1c3b0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
1c3c0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  /.  if( lockType
1c3d0 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  ==_SHM_UNLCK ){.
1c3e0 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f      rc = winUnlo
1c3f0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
1c400 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c  File.h, ofst, 0,
1c410 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65   nByte, 0);.  }e
1c420 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
1c430 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
1c440 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1c450 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61  .    DWORD dwFla
1c460 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
1c470 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
1c480 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
1c490 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
1c4a0 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
1c4b0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
1c4c0 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  OCK;.    rc = wi
1c4d0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
1c4e0 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61  ->hFile.h, dwFla
1c4f0 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  gs, ofst, 0, nBy
1c500 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69  te, 0);.  }..  i
1c510 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
1c520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c530 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1c540 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
1c550 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
1c560 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
1c570 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1c580 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1c590 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e  OCK file=%p, fun
1c5a0 63 3d 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c  c=%s, errno=%lu,
1c5b0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1c5c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1c5d0 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20  le.h, (lockType 
1c5e0 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f  == _SHM_UNLCK) ?
1c5f0 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22   "winUnlockFile"
1c600 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77   :.           "w
1c610 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69  inLockFile", pFi
1c620 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73  le->lastErrno, s
1c630 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1c640 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1c650 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1c660 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
1c670 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
1c680 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
1c690 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
1c6a0 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
1c6b0 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
1c6c0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
1c6d0 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
1c6e0 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
1c6f0 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
1c700 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
1c710 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1c720 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1c730 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
1c740 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
1c750 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
1c760 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1c770 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
1c780 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
1c790 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
1c7a0 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1c7b0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
1c7c0 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
1c7d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1c7e0 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
1c7f0 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
1c800 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
1c810 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  de *p;.  assert(
1c820 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1c830 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  () );.  OSTRACE(
1c840 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d  ("SHM-PURGE pid=
1c850 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d  %lu, deleteFlag=
1c860 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1c870 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1c880 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74  ocessId(), delet
1c890 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20  eFlag));.  pp = 
1c8a0 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
1c8b0 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
1c8c0 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
1c8d0 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
1c8e0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1c8f0 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
1c900 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ){ sqlite3_mutex
1c910 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1c920 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
1c930 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
1c940 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f  i++){.        BO
1c950 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70  OL bRc = osUnmap
1c960 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
1c970 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
1c980 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1c990 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41  ("SHM-PURGE-UNMA
1c9a0 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1c9b0 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c9e0 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1c9f0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1ca00 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1ca10 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1ca20 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1ca30 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
1ca40 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
1ca50 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
1ca60 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1ca70 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64  -PURGE-CLOSE pid
1ca80 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1ca90 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1cab0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1cac0 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
1cad0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1cae0 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
1caf0 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
1cb00 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Rc);.      }.   
1cb10 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
1cb20 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46  h!=NULL && p->hF
1cb30 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  ile.h!=INVALID_H
1cb40 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
1cb50 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1cb60 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1cb70 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
1cb80 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1cb90 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
1cba0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1cbb0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1cbc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1cbd0 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
1cbe0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1cbf0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1cc00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cc10 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1cc20 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69  oc();.        wi
1cc30 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
1cc40 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
1cc50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1cc60 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
1cc70 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1cc80 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1cc90 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1cca0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1ccb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1ccc0 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29  free(p->aRegion)
1ccd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1cce0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
1ccf0 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
1cd00 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
1cd10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
1cd20 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  n the shared-mem
1cd30 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
1cd40 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
1cd50 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a  e file pDbFd..**
1cd60 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
1cd70 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
1cd80 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
1cd90 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
1cda0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
1cdb0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
1cdc0 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
1cdd0 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
1cde0 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
1cdf0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
1ce00 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
1ce10 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
1ce20 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
1ce30 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
1ce40 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53  tic int winOpenS
1ce50 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46  haredMemory(winF
1ce60 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
1ce70 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b  truct winShm *p;
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
1cea0 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
1ceb0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
1cec0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1ced0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  e = 0;   /* The 
1cee0 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1cef0 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1cf00 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1cf30 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
1cf40 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
1cf50 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
1cf60 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d  allocated winShm
1cf70 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  Node */.  int nN
1cf80 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cfa0 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
1cfb0 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73   bytes */..  ass
1cfc0 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
1cfd0 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74  ==0 );    /* Not
1cfe0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1cff0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ed */..  /* Allo
1d000 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1d010 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
1d020 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f  hm object.  Also
1d030 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20   speculatively. 
1d040 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   ** allocate spa
1d050 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e  ce for a new win
1d060 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65  ShmNode and file
1d070 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  name..  */.  p =
1d080 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1d090 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  ro( sizeof(*p) )
1d0a0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1d0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d0c0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
1d0d0 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1d0e0 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
1d0f0 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
1d100 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1d110 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
1d120 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
1d130 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
1d140 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1d150 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1d160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d170 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1d180 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c    }.  pNew->zFil
1d190 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
1d1a0 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74  pNew[1];.  sqlit
1d1b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d  e3_snprintf(nNam
1d1c0 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  e+15, pNew->zFil
1d1d0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
1d1e0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1d1f0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
1d200 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
1d210 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  h, pNew->zFilena
1d220 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  me);..  /* Look 
1d230 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
1d240 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
1d250 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
1d260 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
1d270 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
1d280 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
1d290 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
1d2a0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
1d2b0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1d2c0 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
1d2d0 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
1d2e0 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
1d2f0 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
1d300 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
1d310 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
1d320 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
1d330 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
1d340 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
1d350 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
1d360 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
1d370 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
1d380 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1d390 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
1d3a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
1d3b0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
1d3c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1d3d0 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
1d3e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d3f0 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
1d400 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
1d410 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
1d420 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
1d430 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
1d440 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
1d450 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
1d460 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
1d470 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
1d480 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
1d490 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
1d4a0 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  ode;..    if( sq
1d4b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d4c0 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
1d4d0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d4e0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1d4f0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1d500 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1d510 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
1d520 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1d530 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1d540 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1d550 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1d560 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1d570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d580 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1d590 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20  (pDbFd->pVfs,.  
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d5b0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1d5c0 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
1d5d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1d5e0 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d600 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
1d610 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1d620 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
1d630 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   here */.       
1d640 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1d650 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49  _OPEN_WAL | SQLI
1d660 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1d670 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1d680 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20  CREATE,.        
1d690 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
1d6a0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1d6b0 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
1d6c0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1d6d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
1d6e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
1d6f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1d700 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
1d710 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
1d720 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
1d730 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1d740 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20   zero length..  
1d750 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e    */.    if( win
1d760 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1d770 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
1d780 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1d790 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   1)==SQLITE_OK )
1d7a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1d7b0 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
1d7c0 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1d7d0 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20  de->hFile, 0);. 
1d7e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d7f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d800 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1d810 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d820 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61  SHMOPEN, osGetLa
1d830 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
1d860 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1d870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d880 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
1d8a0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1d8b0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
1d8c0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1d8d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
1d8e0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1d8f0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1d900 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
1d910 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
1d920 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1d930 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1d940 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
1d950 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
1d960 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
1d970 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1d980 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
1d990 68 6d 4e 6f 64 65 3b 0a 23 69 66 20 64 65 66 69  hmNode;.#if defi
1d9a0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1d9b0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1d9c0 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
1d9d0 45 29 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  E).  p->id = pSh
1d9e0 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
1d9f0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
1da00 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
1da10 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
1da20 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1da30 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
1da40 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1da50 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
1da60 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
1da70 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
1da80 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
1da90 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74  of the winShmEnt
1daa0 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
1dab0 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
1dac0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
1dad0 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d  w (struct winShm
1dae0 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
1daf0 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
1db00 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
1db10 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
1db20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
1db30 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
1db40 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
1db50 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
1db60 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
1db70 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
1db80 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
1db90 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
1dba0 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75  e->mutex.  ** mu
1dbb0 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
1dbc0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1dbd0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1dbe0 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
1dbf0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1dc00 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
1dc10 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
1dc20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1dc30 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1dc40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1dc50 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
1dc60 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
1dc70 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
1dc80 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
1dc90 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1dca0 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
1dcb0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
1dcc0 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
1dcd0 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
1dce0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
1dcf0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
1dd00 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
1dd10 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1dd20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1dd30 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
1dd40 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
1dd50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dd60 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
1dd70 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
1dd80 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
1dd90 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1dda0 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
1ddb0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
1ddc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1ddd0 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
1dde0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1ddf0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1de00 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1de10 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1de20 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
1de30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1de40 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67  te after closing
1de50 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1de60 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
1de70 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1de80 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1de90 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d-memory */.  wi
1dea0 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1deb0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1dec0 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
1ded0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  ed */.  winShmNo
1dee0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
1def0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1df00 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1df10 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  le */.  winShm *
1df20 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
1df30 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1df40 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
1df50 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46  tions */..  pDbF
1df60 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1df70 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
1df80 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
1df90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1dfa0 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
1dfb0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
1dfc0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
1dfd0 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
1dfe0 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
1dff0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
1e000 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
1e010 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
1e020 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1e030 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
1e040 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
1e050 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
1e060 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
1e070 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
1e080 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
1e090 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
1e0a0 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
1e0b0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
1e0c0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
1e0d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e0e0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1e0f0 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
1e100 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
1e110 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
1e120 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
1e130 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
1e140 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1e150 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68  , too */.  winSh
1e160 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
1e170 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
1e180 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
1e190 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
1e1a0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1e1b0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1e1c0 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
1e1d0 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46  d->pVfs, deleteF
1e1e0 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53  lag);.  }.  winS
1e1f0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1e200 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e210 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
1e220 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
1e230 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
1e240 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
1e250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1e260 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  inShmLock(.  sql
1e270 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1e280 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e290 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
1e2a0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1e2b0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
1e2c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e2d0 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
1e2e0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1e2f0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1e300 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1e310 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e320 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
1e330 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1e340 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e360 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
1e370 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
1e380 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1e390 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1e3a0 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  d;        /* Con
1e3b0 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
1e3c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1e3d0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
1e3e0 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
1e3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e400 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
1e410 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
1e420 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  winShm *pX;     
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1e450 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
1e460 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53  blings */.  winS
1e470 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1e480 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
1e490 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e4a0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1e4b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1e4c0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
1e4d0 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
1e500 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
1e510 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
1e520 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
1e530 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
1e540 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
1e550 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
1e560 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
1e570 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1e580 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1e590 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1e5a0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1e5b0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1e5c0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
1e5d0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1e5e0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1e5f0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1e600 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1e610 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1e620 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1e630 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1e640 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
1e650 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
1e660 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1e670 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
1e680 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55  mask = (u16)((1U
1e690 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
1e6a0 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73  U<<ofst));.  ass
1e6b0 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
1e6c0 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
1e6d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1e6e0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1e6f0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
1e700 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1e710 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
1e720 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
1e730 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1e740 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
1e750 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
1e760 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
1e770 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
1e780 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
1e790 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1e7a0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1e7b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1e7c0 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
1e7d0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1e7e0 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1e7f0 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
1e800 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
1e810 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
1e820 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
1e830 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1e840 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
1e850 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
1e860 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
1e870 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
1e880 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1e890 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1e8a0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
1e8b0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1e8c0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1e8d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1e8e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1e8f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
1e900 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
1e910 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1e920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e930 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
1e940 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
1e950 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1e960 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1e970 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
1e980 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1e990 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
1e9a0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
1e9b0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
1e9c0 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
1e9d0 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
1e9e0 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
1e9f0 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
1ea00 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
1ea10 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
1ea20 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1ea30 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
1ea40 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
1ea50 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
1ea60 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
1ea70 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
1ea80 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
1ea90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1eaa0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1eab0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1eac0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1ead0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1eae0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1eaf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eb00 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1eb10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1eb20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
1eb30 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1eb40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1eb50 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
1eb60 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
1eb70 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
1eb80 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
1eb90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1eba0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
1ebb0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
1ebc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1ebd0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1ebe0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
1ebf0 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
1ec00 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1ec10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ec30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ec40 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1ec50 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
1ec60 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1ec70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ec80 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
1ec90 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1eca0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1ecb0 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
1ecc0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1ecd0 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
1ece0 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
1ecf0 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
1ed00 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
1ed10 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
1ed20 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
1ed30 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1ed40 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1ed50 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1ed60 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1ed70 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1ed80 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
1ed90 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
1eda0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1edb0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1edc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1edd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ede0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
1edf0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
1ee00 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1ee10 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
1ee20 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
1ee30 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
1ee40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
1ee50 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
1ee60 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1ee70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ee80 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1ee90 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1eea0 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f  e, _SHM_WRLCK, o
1eeb0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1eec0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
1eed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1eee0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1eef0 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
1ef00 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
1ef10 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
1ef20 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1ef30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
1ef40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1ef50 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1ef60 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
1ef70 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c  "SHM-LOCK pid=%l
1ef80 75 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64  u, id=%d, shared
1ef90 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d  Mask=%03x, exclM
1efa0 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c  ask=%03x, rc=%s\
1efb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1efc0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1efd0 73 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70  ssId(), p->id, p
1efe0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
1eff0 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20  >exclMask,.     
1f000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1f010 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
1f020 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f030 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
1f040 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
1f050 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
1f060 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a  shared memory..*
1f070 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
1f080 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
1f090 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
1f0a0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
1f0b0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
1f0c0 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
1f0d0 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
1f0e0 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
1f0f0 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
1f100 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
1f110 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
1f120 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1f130 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1f140 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
1f150 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1f160 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
1f170 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
1f180 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69  /* compiler-defi
1f190 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  ned memory barri
1f1a0 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  er */.  winShmEn
1f1b0 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20  terMutex();     
1f1c0 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c    /* Also mutex,
1f1d0 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20   for redundancy 
1f1e0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  */.  winShmLeave
1f1f0 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
1f200 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f210 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
1f220 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
1f230 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20   region iRegion 
1f240 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64  of the.** shared
1f250 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
1f260 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1f270 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
1f280 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1f290 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ons.** are numbe
1f2a0 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1f2b0 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1f2c0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1f2d0 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a  n is szRegion.**
1f2e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1f2f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1f300 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1f310 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1f320 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
1f330 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1f340 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1f350 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61  the isWrite para
1f360 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
1f370 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1f380 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
1f390 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
1f3a0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
1f3b0 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
1f3c0 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
1f3d0 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
1f3e0 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
1f3f0 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
1f400 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1f410 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  OK returned. If.
1f420 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  ** isWrite is no
1f430 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
1f440 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
1f450 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1f460 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65  s not yet.** bee
1f470 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1f480 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
1f490 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1f4a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
1f4b0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1f4c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f4d0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
1f4e0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
1f4f0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
1f500 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
1f510 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
1f520 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
1f530 65 73 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73  esses.** address
1f540 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
1f550 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
1f560 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
1f570 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
1f580 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
1f590 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1f5a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1f5b0 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71   winShmMap(.  sq
1f5c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f5e0 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
1f5f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f600 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
1f630 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
1f640 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f660 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
1f670 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74   */.  int isWrit
1f680 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f690 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1f6a0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
1f6b0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
1f6c0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
1f6d0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1f6e0 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
1f6f0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  mory */.){.  win
1f700 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1f710 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69  inFile*)fd;.  wi
1f720 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20 70 44 62  nShm *pShm = pDb
1f730 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53  Fd->pShm;.  winS
1f740 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1f750 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1f760 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
1f770 70 53 68 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  pShm ){.    rc =
1f780 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
1f790 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
1f7a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f7b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1f7c0 20 20 20 20 70 53 68 6d 20 3d 20 70 44 62 46 64      pShm = pDbFd
1f7d0 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53  ->pShm;.  }.  pS
1f7e0 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 2d 3e 70  hmNode = pShm->p
1f7f0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69  ShmNode;..  sqli
1f800 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1f810 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1f820 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
1f830 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
1f840 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
1f850 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
1f860 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1f870 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1f880 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
1f890 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
1f8a0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1f8b0 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
1f8c0 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
1f8d0 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
1f8e0 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
1f8f0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
1f900 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1f910 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
1f920 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
1f930 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1f940 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
1f950 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
1f960 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
1f970 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
1f980 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
1f990 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
1f9a0 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
1f9b0 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1f9c0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
1f9d0 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
1f9e0 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
1f9f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
1fa00 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
1fa10 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
1fa20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
1fa30 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
1fa40 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
1fa50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1fa60 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
1fa70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1fa80 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1fa90 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
1faa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fab0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1fac0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1fad0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1fae0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb00 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31       "winShmMap1
1fb10 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1fb20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1fb30 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1fb40 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74  .    if( sz<nByt
1fb50 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
1fb60 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1fb70 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
1fb80 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57  ot exist. If isW
1fb90 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20  rite is set to. 
1fba0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78       ** zero, ex
1fbb0 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
1fbc0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
1fbd0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1fbe0 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
1fbf0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  **.      ** Alte
1fc00 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73  rnatively, if is
1fc10 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1fc20 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  o, use ftruncate
1fc30 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
1fc40 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
1fc50 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1fc60 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1fc70 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65      if( !isWrite
1fc80 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
1fc90 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  out;.      rc = 
1fca0 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1fcb0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1fcc0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42  mNode->hFile, nB
1fcd0 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
1fce0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fcf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1fd00 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1fd10 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1fd20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1fd30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fd40 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1fd50 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
1fd60 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1fd70 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1fd80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fd90 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
1fda0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1fdb0 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
1fdc0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1fdd0 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
1fde0 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
1fdf0 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
1fe00 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
1fe10 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1fe20 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65  e->aRegion, (iRe
1fe30 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61  gion+1)*sizeof(a
1fe40 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a  pNew[0]).    );.
1fe50 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
1fe60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1fe70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1fe80 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
1fe90 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1fea0 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
1feb0 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  ->aRegion = apNe
1fec0 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70  w;..    while( p
1fed0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1fee0 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
1fef0 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d     HANDLE hMap =
1ff00 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f   NULL;         /
1ff10 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68  * file-mapping h
1ff20 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76  andle */.      v
1ff30 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20  oid *pMap = 0;  
1ff40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1ff50 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  pped memory regi
1ff60 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54  on */..#if SQLIT
1ff70 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1ff80 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
1ff90 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
1ffa0 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  pp(pShmNode->hFi
1ffb0 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
1ffc0 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1ffd0 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  RITE, nByte, NUL
1ffe0 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
1fff0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
20000 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
20010 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
20020 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
20030 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  W(pShmNode->hFil
20040 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
20050 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
20060 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
20070 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
20080 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
20090 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
200a0 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  ) && SQLITE_WIN3
200b0 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50  2_CREATEFILEMAPP
200c0 49 4e 47 41 0a 20 20 20 20 20 20 68 4d 61 70 20  INGA.      hMap 
200d0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
200e0 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d  ppingA(pShmNode-
200f0 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
20100 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
20110 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
20120 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
20130 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
20140 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
20150 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
20160 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65   region=%d, size
20170 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
20190 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
201a0 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
201b0 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c  >nRegion, nByte,
201c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
201d0 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  hMap ? "ok" : "f
201e0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
201f0 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
20200 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
20210 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  = pShmNode->nReg
20220 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
20230 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
20240 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
20250 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
20260 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
20270 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54  arity;.#if SQLIT
20280 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
20290 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
202a0 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
202b0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
202c0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
202d0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
202e0 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66     iOffset - iOf
202f0 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
20300 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
20310 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
20320 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70  lse.        pMap
20330 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
20340 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  le(hMap, FILE_MA
20350 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
20360 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
20370 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20       0, iOffset 
20380 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
20390 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
203a0 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
203b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
203c0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
203d0 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  MAP-MAP pid=%lu,
203e0 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73   region=%d, offs
203f0 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20  et=%d, size=%d, 
20400 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
20410 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
20420 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
20430 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
20440 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a  egion, iOffset,.
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20   szRegion, pMap 
20470 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
20480 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
20490 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a     if( !pMap ){.
204a0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
204b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
204c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
204d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
204e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
204f0 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53  IOERR_SHMMAP, pS
20500 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
20510 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
20520 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
20530 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d  ShmMap3", pDbFd-
20540 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
20550 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c   if( hMap ) osCl
20560 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b  oseHandle(hMap);
20570 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
20580 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
20590 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   }..      pShmNo
205a0 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
205b0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70  Node->nRegion].p
205c0 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20  Map = pMap;.    
205d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
205e0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
205f0 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d  egion].hMap = hM
20600 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
20610 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
20620 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
20630 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
20640 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
20650 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  Region ){.    in
20660 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67  t iOffset = iReg
20670 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
20680 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
20690 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
206a0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
206b0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
206c0 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  y;.    char *p =
206d0 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64   (char *)pShmNod
206e0 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69  e->aRegion[iRegi
206f0 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70  on].pMap;.    *p
20700 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69  p = (void *)&p[i
20710 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20  OffsetShift];.  
20720 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
20730 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
20740 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
20750 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
20760 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20770 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
20780 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  inShmMap     0.#
20790 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f   define winShmLo
207a0 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
207b0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30   winShmBarrier 0
207c0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
207d0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
207e0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
207f0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
20800 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20  /*.** Cleans up 
20810 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f  the mapped regio
20820 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  n of the specifi
20830 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e  ed file, if any.
20840 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
20850 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
20860 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d  tatic int winUnm
20870 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
20880 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74  pFile){.  assert
20890 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
208a0 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
208b0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
208c0 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
208d0 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
208e0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d  ".           "mm
208f0 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61  apSize=%lld, mma
20900 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64  pSizeActual=%lld
20910 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c  , mmapSizeMax=%l
20920 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
20930 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
20940 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
20950 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70  , pFile->hMap, p
20960 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
20970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
20980 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46  le->mmapSize, pF
20990 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
209a0 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ual, pFile->mmap
209b0 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28  SizeMax));.  if(
209c0 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
209d0 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  on ){.    if( !o
209e0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
209f0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
20a00 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  on) ){.      pFi
20a10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
20a20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
20a30 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
20a40 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
20a50 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20a60 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
20a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20a80 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  "rc=SQLITE_IOERR
20a90 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43  _MMAP\n", osGetC
20aa0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20ab0 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20  ), pFile,.      
20ac0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
20ad0 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20  pMapRegion));.  
20ae0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
20af0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20b00 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
20b10 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b30 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69       "winUnmapfi
20b40 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  le1", pFile->zPa
20b50 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
20b60 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
20b70 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
20b80 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
20b90 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
20ba0 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
20bb0 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
20bc0 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map!=NULL ){.   
20bd0 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e   if( !osCloseHan
20be0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29  dle(pFile->hMap)
20bf0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20c00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
20c10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
20c20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
20c30 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
20c40 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
20c50 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  p=%p, rc=SQLITE_
20c60 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20  IOERR_MMAP\n",. 
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
20c80 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20c90 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
20ca0 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20  ile->hMap));.   
20cb0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
20cc0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
20cd0 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
20ce0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
20d10 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
20d20 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
20d30 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
20d40 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
20d50 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
20d60 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20d70 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
20d80 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20d90 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20da0 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20  d(), pFile));.  
20db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
20dd0 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
20de0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
20df0 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
20e00 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
20e10 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
20e20 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
20e30 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
20e40 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
20e50 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a   new). Or, if.**
20e60 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
20e70 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
20e80 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
20e90 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
20ea0 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  ll.** outstandin
20eb0 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
20ec0 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
20ed0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
20ee0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
20ef0 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
20f00 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
20f10 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
20f20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
20f30 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67  f.** the mapping
20f40 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
20f50 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
20f60 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
20f70 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72  o, then the.** r
20f80 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
20f90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20fa0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
20fb0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
20fc0 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
20fd0 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
20fe0 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
20ff0 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
21000 75 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  ue configured.**
21010 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
21020 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77  NTL_MMAP_SIZE, w
21030 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
21040 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
21050 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21060 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
21070 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
21080 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
21090 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
210a0 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
210b0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
210c0 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
210d0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
210e0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
210f0 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69  tic int winMapfi
21100 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c  le(winFile *pFd,
21110 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
21120 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Byte){.  sqlite3
21130 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42  _int64 nMap = nB
21140 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  yte;.  int rc;..
21150 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d    assert( nMap>=
21160 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68  0 || pFd->nFetch
21170 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52  Out==0 );.  OSTR
21180 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
21190 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
211a0 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a  , size=%lld\n",.
211b0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
211c0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
211d0 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29  (), pFd, nByte))
211e0 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  ;..  if( pFd->nF
211f0 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
21200 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
21210 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
21220 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
21230 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
21240 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a  e*)pFd, &nMap);.
21250 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
21260 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
21270 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
21280 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
21290 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c  ITE_IOERR_FSTAT\
212a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
212b0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
212c0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
212d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
212e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
212f0 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  AT;.    }.  }.  
21300 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
21310 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
21320 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
21330 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20  pSizeMax;.  }.  
21340 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65  nMap &= ~(sqlite
21350 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49  3_int64)(winSysI
21360 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d  nfo.dwPageSize -
21370 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70   1);..  if( nMap
21380 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70  ==0 && pFd->mmap
21390 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69  Size>0 ){.    wi
213a0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
213b0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21  .  }.  if( nMap!
213c0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
213d0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
213e0 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20   = 0;.    DWORD 
213f0 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
21400 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f  EADONLY;.    DWO
21410 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f  RD flags = FILE_
21420 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77  MAP_READ;..    w
21430 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
21440 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21450 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
21460 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72     if( (pFd->ctr
21470 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
21480 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20  _RDONLY)==0 ){. 
21490 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50       protect = P
214a0 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  AGE_READWRITE;. 
214b0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49       flags |= FI
214c0 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20  LE_MAP_WRITE;.  
214d0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
214e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
214f0 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
21500 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
21510 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  ngFromApp(pFd->h
21520 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
21530 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65   nMap, NULL);.#e
21540 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
21550 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
21560 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  E).    pFd->hMap
21570 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
21580 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20  appingW(pFd->h, 
21590 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
215a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
215c0 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
215d0 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
215e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
21610 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
21620 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
21630 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
21640 41 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49  AS_ANSI) && SQLI
21650 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46  TE_WIN32_CREATEF
21660 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20  ILEMAPPINGA.    
21670 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
21680 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
21690 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
216a0 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
216d0 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
216e0 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
21710 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
21720 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  fff), NULL);.#en
21730 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d  dif.    if( pFd-
21740 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  >hMap==NULL ){. 
21750 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72       pFd->lastEr
21760 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
21770 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
21780 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
21790 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
217a0 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , pFd->lastErrno
217b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
217c0 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70           "winMap
217d0 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61  file1", pFd->zPa
217e0 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f  th);.      /* Lo
217f0 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74  g the error, but
21800 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c   continue normal
21810 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67   operation using
21820 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f   xRead/xWrite */
21830 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21840 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45  "MAP-FILE-CREATE
21850 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
21860 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
21880 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
21890 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
218a0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
218b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
218c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
218d0 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70     assert( (nMap
218e0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
218f0 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a  PageSize)==0 );.
21900 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
21910 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65  of(SIZE_T)==size
21920 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  of(sqlite3_int64
21930 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66  ) || nMap<=0xfff
21940 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c  fffff );.#if SQL
21950 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
21960 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
21970 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70  wOfFileFromApp(p
21980 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c  Fd->hMap, flags,
21990 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70   0, (SIZE_T)nMap
219a0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  );.#else.    pNe
219b0 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
219c0 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66  ile(pFd->hMap, f
219d0 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a  lags, 0, 0, (SIZ
219e0 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69  E_T)nMap);.#endi
219f0 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  f.    if( pNew==
21a00 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73  NULL ){.      os
21a10 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d  CloseHandle(pFd-
21a20 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46  >hMap);.      pF
21a30 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  d->hMap = NULL;.
21a40 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
21a50 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
21a60 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
21a70 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
21a80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
21a90 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
21aa0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
21ab0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
21ac0 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50  pfile2", pFd->zP
21ad0 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
21ae0 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
21af0 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
21b00 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
21b10 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
21b20 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
21b30 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70  ("MAP-FILE-MAP p
21b40 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
21b50 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
21b60 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
21b70 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
21b80 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
21b90 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
21ba0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21bb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
21bc0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
21bd0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64   = pNew;.    pFd
21be0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61  ->mmapSize = nMa
21bf0 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  p;.    pFd->mmap
21c00 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61  SizeActual = nMa
21c10 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  p;.  }..  OSTRAC
21c20 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
21c30 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
21c40 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
21c50 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
21c60 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
21c70 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65  d(), pFd));.  re
21c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21c90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
21ca0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
21cb0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
21cc0 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
21cd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21ce0 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
21cf0 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
21d00 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
21d10 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
21d20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
21d30 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
21d40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
21d50 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
21d60 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
21d70 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
21d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
21d90 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
21da0 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
21db0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
21dc0 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
21dd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
21de0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
21df0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
21e00 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
21e10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
21e20 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
21e30 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
21e40 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
21e50 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
21e60 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
21e70 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
21e80 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
21e90 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  t eventually.** 
21ea0 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
21eb0 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
21ec0 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a   winUnfetch()..*
21ed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
21ee0 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
21ef0 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
21f00 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
21f10 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
21f20 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
21f30 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
21f40 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
21f50 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
21f60 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
21f70 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
21f80 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  *pp = 0;..  OSTR
21f90 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
21fa0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
21fb0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75  ffset=%lld, amou
21fc0 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c  nt=%d, pp=%p\n",
21fd0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
21fe0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
21ff0 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e  d(), fd, iOff, n
22000 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20  Amt, pp));..#if 
22010 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
22020 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
22030 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
22040 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
22050 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
22060 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
22070 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  winMapfile(pFd, 
22080 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
22090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
220a0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
220b0 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
220c0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
220d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
220e0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
220f0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
22100 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
22110 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
22120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22130 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
22140 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
22150 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
22160 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
22170 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
22180 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
22190 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
221a0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
221b0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
221c0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
221d0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25  , pFile=%p, pp=%
221e0 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51  p, *pp=%p, rc=SQ
221f0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
22200 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
22210 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
22220 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20  fd, pp, *pp));. 
22230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22240 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
22250 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
22260 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
22270 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
22280 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20  n releases a.** 
22290 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e  reference obtain
222a0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
222b0 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63   call to winFetc
222c0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
222d0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
222e0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
222f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
22300 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
22310 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
22320 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
22330 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
22340 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
22350 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  on..**.** Or, if
22360 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
22370 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
22380 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
22390 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a  is being called.
223a0 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
223b0 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
223c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
223d0 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
223e0 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79  g mapping.** may
223f0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
22400 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
22410 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
22420 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
22430 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
22440 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
22450 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
22460 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
22470 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64  0.  winFile *pFd
22480 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
22490 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
224a0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
224b0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70  le */..  /* If p
224c0 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
224d0 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
224e0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
224f0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20  o outstanding.  
22500 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ** xFetch refere
22510 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d  nces. Or, if p!=
22520 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  0 (meaning it is
22530 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72   an xFetch refer
22540 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  ence),.  ** then
22550 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
22560 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
22570 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61  tanding.  */.  a
22580 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28  ssert( (p==0)==(
22590 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
225a0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  0) );..  /* If p
225b0 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74  !=0, it must mat
225c0 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75  ch the iOff valu
225d0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
225e0 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38  p==0 || p==&((u8
225f0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
22600 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20  on)[iOff] );..  
22610 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
22620 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
22630 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
22640 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  , p=%p\n",.     
22650 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
22660 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
22670 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a  Fd, iOff, p));..
22680 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
22690 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
226a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
226b0 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64   FIXME:  If Wind
226c0 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73  ows truly always
226d0 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61   prevents trunca
226e0 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67  ting or deleting
226f0 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77   a.    ** file w
22700 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69  hile a mapping i
22710 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65  s held, then the
22720 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e   following winUn
22730 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20  mapfile() call. 
22740 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73     ** is unneces
22750 73 61 72 79 20 63 61 6e 20 62 65 20 6f 6d 69 74  sary can be omit
22760 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c  ted - potentiall
22770 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20  y improving.    
22780 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  ** performance. 
22790 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   */.    winUnmap
227a0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a  file(pFd);.  }..
227b0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
227c0 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23  FetchOut>=0 );.#
227d0 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
227e0 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25  (("UNFETCH pid=%
227f0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
22800 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
22810 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
22820 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
22830 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72  ), fd));.  retur
22840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22850 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
22860 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
22870 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
22880 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
22890 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
228a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
228b0 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
228c0 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
228d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
228e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
228f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22930 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  */../*.** This v
22940 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
22950 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
22960 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
22970 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
22980 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
22990 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
229a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
229b0 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
229c0 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
229f0 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
22a20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
22a50 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
22a80 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
22ab0 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ad0 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
22ae0 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
22b10 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20  /.  winLock,    
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b30 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
22b40 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20    winUnlock,    
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
22b70 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
22b80 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
22b90 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
22ba0 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
22bb0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22bd0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
22be0 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
22c10 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
22c20 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
22c30 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
22c40 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
22c50 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
22c80 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ca0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
22cb0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
22cc0 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
22cd0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
22ce0 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
22cf0 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
22d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
22d10 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46  mUnmap */.  winF
22d20 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
22d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22d40 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e  Fetch */.  winUn
22d50 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20  fetch           
22d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
22d70 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  nfetch */.};../*
22d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
22dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22de0 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
22df0 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
22e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
22e20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
22e30 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
22e40 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
22e50 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
22e60 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
22e70 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  t..*/..#if defin
22e80 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f  ed(__CYGWIN__)./
22e90 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66  *.** Convert a f
22ea0 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61  ilename from wha
22eb0 74 65 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c  tever the underl
22ec0 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
22ed0 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74  ystem.** support
22ee0 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20  s for filenames 
22ef0 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  into UTF-8.  Spa
22f00 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
22f10 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61  esult is.** obta
22f20 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
22f30 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
22f40 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
22f50 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
22f60 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43  tatic char *winC
22f70 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65  onvertToUtf8File
22f80 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  name(const void 
22f90 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
22fa0 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  har *zConverted 
22fb0 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
22fc0 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
22fd0 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f  erted = winUnico
22fe0 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61  deToUtf8(zFilena
22ff0 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
23000 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
23010 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
23020 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
23030 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 46 69  inMbcsToUtf8(zFi
23040 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c  lename, osAreFil
23050 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
23060 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
23070 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
23080 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
23090 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
230a0 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a  erted;.}.#endif.
230b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
230c0 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20   UTF-8 filename 
230d0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
230e0 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  rm the underlyin
230f0 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  g.** operating s
23100 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65  ystem wants file
23110 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65  names in.  Space
23120 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
23130 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ult.** is obtain
23140 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
23150 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
23160 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
23170 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
23180 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
23190 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
231a0 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
231b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
231c0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
231d0 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73  ed = 0;.  if( os
231e0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  IsNT() ){.    zC
231f0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74  onverted = winUt
23200 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
23210 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
23220 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
23230 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
23240 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
23250 3d 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  = winUtf8ToMbcs(
23260 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65  zFilename, osAre
23270 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b  FileApisANSI());
23280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
23290 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
232a0 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
232b0 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
232c0 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
232d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
232e0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
232f0 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
23300 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  ed UTF-8 string 
23310 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77  buffer.** ends w
23320 69 74 68 20 61 20 64 69 72 65 63 74 6f 72 79 20  ith a directory 
23330 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
23340 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73  ter or one was s
23350 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61  uccessfully.** a
23360 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  dded to it..*/.s
23370 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b  tatic int winMak
23380 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74  eEndInDirSep(int
23390 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
233a0 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29  f){.  if( zBuf )
233b0 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d  {.    int nLen =
233c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
233d0 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20  (zBuf);.    if( 
233e0 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  nLen>0 ){.      
233f0 69 66 28 20 77 69 6e 49 73 44 69 72 53 65 70 28  if( winIsDirSep(
23400 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b  zBuf[nLen-1]) ){
23410 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23420 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
23430 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29  f( nLen+1<nBuf )
23440 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e  {.        zBuf[n
23450 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72  Len] = winGetDir
23460 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a  Sep();.        z
23470 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c  Buf[nLen+1] = '\
23480 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0';.        retu
23490 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
234a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
234b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
234c0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
234d0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74  file name and st
234e0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ore the resultin
234f0 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70  g pointer into p
23500 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69  zBuf..** The poi
23510 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  nter returned in
23520 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66   pzBuf must be f
23530 72 65 65 64 20 76 69 61 20 73 71 6c 69 74 65 33  reed via sqlite3
23540 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
23550 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d  ic int winGetTem
23560 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  pname(sqlite3_vf
23570 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a  s *pVfs, char **
23580 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  pzBuf){.  static
23590 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
235a0 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
235b0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
235c0 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
235d0 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
235e0 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
235f0 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c  89";.  size_t i,
23600 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d   j;.  int nPre =
23610 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
23620 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
23630 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74  E_PREFIX);.  int
23640 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69   nMax, nBuf, nDi
23650 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20  r, nLen;.  char 
23660 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zBuf;..  /* It'
23670 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
23680 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
23690 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
236a0 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
236b0 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
236c0 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
236d0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
236e0 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
236f0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
23700 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a  n failing..  */.
23710 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
23720 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
23730 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20  _IOERR );..  /* 
23740 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f  Allocate a tempo
23750 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 73  rary buffer to s
23760 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71  tore the fully q
23770 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20  ualified file.  
23780 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ** name for the 
23790 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
237a0 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
237b0 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e  we cannot contin
237c0 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20  ue..  */.  nMax 
237d0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
237e0 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20  me; nBuf = nMax 
237f0 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71  + 2;.  zBuf = sq
23800 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
23810 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21   nBuf );.  if( !
23820 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52  zBuf ){.    OSTR
23830 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
23840 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
23850 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
23860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23870 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
23880 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  PT;.  }..  /* Fi
23890 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
238a0 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79  ective temporary
238b0 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72   directory.  Fir
238c0 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65  st, check if one
238d0 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65  .  ** has been e
238e0 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79  xplicitly set by
238f0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
23900 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65  ; otherwise, use
23910 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f   the one.  ** co
23920 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20  nfigured by the 
23930 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
23940 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20  ..  */.  nDir = 
23950 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31  nMax - (nPre + 1
23960 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44  5);.  assert( nD
23970 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71  ir>0 );.  if( sq
23980 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
23990 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  tory ){.    int 
239a0 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65  nDirLen = sqlite
239b0 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
239c0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
239d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c  );.    if( nDirL
239e0 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  en>0 ){.      if
239f0 28 20 21 77 69 6e 49 73 44 69 72 53 65 70 28 73  ( !winIsDirSep(s
23a00 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
23a10 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d  ctory[nDirLen-1]
23a20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69  ) ){.        nDi
23a30 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rLen++;.      }.
23a40 20 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65        if( nDirLe
23a50 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20  n>nDir ){.      
23a60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23a70 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Buf);.        OS
23a80 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
23a90 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
23aa0 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
23ab0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
23ac0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
23ad0 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
23ae0 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20  empname1", 0);. 
23af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23b00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
23b10 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
23b20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
23b30 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20  ectory);.    }. 
23b40 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
23b50 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73  _CYGWIN__).  els
23b60 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
23b70 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
23b80 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c  [] = {.       0,
23b90 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49   /* getenv("SQLI
23ba0 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20  TE_TMPDIR") */. 
23bb0 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
23bc0 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a  nv("TMPDIR") */.
23bd0 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
23be0 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20  env("TMP") */.  
23bf0 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
23c00 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20  v("TEMP") */.   
23c10 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
23c20 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20  ("USERPROFILE") 
23c30 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f  */.       "/var/
23c40 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75  tmp",.       "/u
23c50 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  sr/tmp",.       
23c60 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  "/tmp",.       "
23c70 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20  .",.       0    
23c80 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
23c90 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b  inator */.    };
23ca0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
23cb0 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t i;.    const c
23cc0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
23cd0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
23ce0 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d  0] ) azDirs[0] =
23cf0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
23d00 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
23d10 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
23d20 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
23d30 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  v("TMPDIR");.   
23d40 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20   if( !azDirs[2] 
23d50 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65  ) azDirs[2] = ge
23d60 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20  tenv("TMP");.   
23d70 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20   if( !azDirs[3] 
23d80 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65  ) azDirs[3] = ge
23d90 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20  tenv("TEMP");.  
23da0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d    if( !azDirs[4]
23db0 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67   ) azDirs[4] = g
23dc0 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
23dd0 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  LE");.    for(i=
23de0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
23df0 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
23e00 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
23e10 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20  rs[i++]){.      
23e20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
23e30 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69 72  ;.      if( zDir
23e40 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23e50 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
23e60 70 61 74 68 20 73 74 61 72 74 73 20 77 69 74 68  path starts with
23e70 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 20   a drive letter 
23e80 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20  followed by the 
23e90 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63  colon.      ** c
23ea0 68 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65  haracter, assume
23eb0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
23ec0 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61   native Win32 pa
23ed0 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20  th; otherwise,. 
23ee0 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20       ** it must 
23ef0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  be converted to 
23f00 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70  a native Win32 p
23f10 61 74 68 20 76 69 61 20 74 68 65 20 43 79 67 77  ath via the Cygw
23f20 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20  in API.      ** 
23f30 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69  prior to using i
23f40 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
23f50 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65    if( winIsDrive
23f60 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
23f70 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dir) ){.        
23f80 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
23f90 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
23fa0 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20  ilename(zDir);. 
23fb0 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
23fc0 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
23fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23fe0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
23ff0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
24000 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
24010 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
24020 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
24030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
24040 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
24050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24060 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
24070 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
24080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24090 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
240a0 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29  Buf, "%s", zDir)
240b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
240c0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
240d0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
240e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
240f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24100 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24110 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
24120 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
24130 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ed = sqlite3Mall
24140 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29  ocZero( nMax+1 )
24150 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
24160 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
24170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
24180 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
24190 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
241a0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
241b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
241c0 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
241d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
241e0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
241f0 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
24200 20 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f       if( cygwin_
24210 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
24220 20 20 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e             osIsN
24230 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f  T() ? CCP_POSIX_
24240 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50  TO_WIN_W : CCP_P
24250 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a  OSIX_TO_WIN_A, z
24260 44 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Dir,.           
24270 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c       zConverted,
24280 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20   nMax+1)<0 ){.  
24290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
242a0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
242b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
242c0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
242d0 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
242e0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
242f0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
24300 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b  R_CONVPATH\n"));
24310 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
24320 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
24330 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
24340 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
24350 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
24380 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
24390 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
243a0 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
243b0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
243c0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
243d0 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20  nt, we know the 
243e0 63 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74  candidate direct
243f0 6f 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73  ory exists and s
24400 68 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20  hould.          
24410 2a 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77  ** be used.  How
24420 65 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65  ever, we may nee
24430 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65  d to convert the
24440 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
24450 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
24460 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54  its name into UT
24470 46 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20  F-8 (i.e. if it 
24480 69 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20  is UTF-16 right 
24490 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20  now)..          
244a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  */.          cha
244b0 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
244c0 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
244d0 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ame(zConverted);
244e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
244f0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
24500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24510 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
24520 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24530 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
24540 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
24550 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
24560 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
24570 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
24580 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
24590 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
245a0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
245b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
245c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
245d0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
245e0 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
245f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24600 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ee(zUtf8);.     
24610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24620 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
24630 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24650 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24660 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
24670 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
24680 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  lif !SQLITE_OS_W
24690 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
246a0 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
246b0 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29  lse if( osIsNT()
246c0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
246d0 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52  ulti;.    LPWSTR
246e0 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c   zWidePath = sql
246f0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
24700 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41  nMax*sizeof(WCHA
24710 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  R) );.    if( !z
24720 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20  WidePath ){.    
24730 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24740 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
24750 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
24760 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
24770 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
24780 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24790 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
247a0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
247b0 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
247c0 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61  hW(nMax, zWidePa
247d0 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
247e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
247f0 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73  dePath);.      s
24800 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
24810 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
24820 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
24830 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
24840 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
24850 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24860 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
24870 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
24880 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
24890 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248b0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
248c0 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  2", 0);.    }.  
248d0 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e    zMulti = winUn
248e0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
248f0 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
24900 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
24910 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
24920 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
24930 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
24940 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24950 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
24960 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
24970 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Path);.    }else
24980 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24990 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
249a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
249b0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
249c0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
249d0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
249e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
249f0 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
24a00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
24a10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
24a20 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
24a30 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
24a40 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
24a50 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63  ar *zUtf8;.    c
24a60 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d  har *zMbcsPath =
24a70 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
24a80 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20  ro( nMax );.    
24a90 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29  if( !zMbcsPath )
24aa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24ab0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
24ac0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
24ad0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
24ae0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
24af0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
24b00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24b10 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24b20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
24b30 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a  empPathA(nMax, z
24b40 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a  MbcsPath)==0 ){.
24b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24b60 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
24b70 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
24b80 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
24b90 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
24ba0 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
24bb0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
24bc0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
24bd0 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47  GETTEMPPATH, osG
24be0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c00 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
24c10 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20  empname3", 0);. 
24c20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d     }.    zUtf8 =
24c30 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a   winMbcsToUtf8(z
24c40 4d 62 63 73 50 61 74 68 2c 20 6f 73 41 72 65 46  MbcsPath, osAreF
24c50 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
24c60 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
24c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
24c80 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
24c90 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
24ca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24cb0 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
24cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
24cd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
24ce0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
24cf0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
24d00 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
24d10 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
24d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24d30 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
24d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
24d50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
24d60 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23  32_HAS_ANSI */.#
24d70 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
24d80 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20  _OS_WINRT */..  
24d90 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  /*.  ** Check to
24da0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
24db0 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
24dc0 72 79 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20  ry ends with an 
24dd0 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a  appropriate.  **
24de0 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20   separator.  If 
24df0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20  it does not and 
24e00 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f  there is not eno
24e10 75 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 74  ugh space left t
24e20 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20  o add.  ** one, 
24e30 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  fail..  */.  if(
24e40 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69   !winMakeEndInDi
24e50 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75  rSep(nDir+1, zBu
24e60 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  f) ){.    sqlite
24e70 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
24e80 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
24e90 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
24ea0 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
24eb0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
24ec0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
24ed0 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
24ee0 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20  empname4", 0);. 
24ef0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68   }..  /*.  ** Ch
24f00 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
24f10 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
24f20 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
24f30 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
24f40 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  e.  ** name in t
24f50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
24f60 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mat:.  **.  **  
24f70 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72   "<temporary_dir
24f80 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58  ectory>/etilqs_X
24f90 58 58 58 58 58 58 58 58 58 58 58 58 58 58 5c 30  XXXXXXXXXXXXXX\0
24fa0 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  \0".  **.  ** If
24fb0 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
24fc0 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20  ITE_ERROR.  The 
24fd0 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75 73 65  number 17 is use
24fe0 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  d here in order 
24ff0 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20  to.  ** account 
25000 66 6f 72 20 74 68 65 20 73 70 61 63 65 20 75 73  for the space us
25010 65 64 20 62 79 20 74 68 65 20 31 35 20 63 68 61  ed by the 15 cha
25020 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75  racter random su
25030 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a  ffix and the.  *
25040 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e  * two trailing N
25050 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  UL characters.  
25060 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74  The final direct
25070 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68  ory separator ch
25080 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73  aracter.  ** has
25090 20 61 6c 72 65 61 64 79 20 61 64 64 65 64 20 69   already added i
250a0 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72  f it was not alr
250b0 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20  eady present..  
250c0 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69  */.  nLen = sqli
250d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
250e0 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b  );.  if( (nLen +
250f0 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42   nPre + 17) > nB
25100 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  uf ){.    sqlite
25110 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
25120 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
25130 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
25140 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
25150 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
25160 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
25170 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
25180 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20  empname5", 0);. 
25190 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   }..  sqlite3_sn
251a0 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e  printf(nBuf-16-n
251b0 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20  Len, zBuf+nLen, 
251c0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
251d0 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d  _PREFIX);..  j =
251e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
251f0 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65  (zBuf);.  sqlite
25200 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
25210 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f   &zBuf[j]);.  fo
25220 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
25230 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66  , j++){.    zBuf
25240 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
25250 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
25260 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
25270 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
25280 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d  ];.  }.  zBuf[j]
25290 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31   = 0;.  zBuf[j+1
252a0 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20  ] = 0;.  *pzBuf 
252b0 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41  = zBuf;..  OSTRA
252c0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
252d0 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  ME name=%s, rc=S
252e0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75  QLITE_OK\n", zBu
252f0 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  f));.  return SQ
25300 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25310 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
25320 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20   the named file 
25330 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65  is really a dire
25340 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66  ctory.  Return f
25350 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73  alse if.** it is
25360 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
25370 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72   than a director
25380 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  y, or if there i
25390 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65  s any kind of me
253a0 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
253b0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
253c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
253d0 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  ir(const void *z
253e0 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57  Converted){.  DW
253f0 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
25400 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
25410 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66  lastErrno;..  if
25420 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
25430 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
25440 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
25450 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
25460 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
25470 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
25480 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
25490 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
254a0 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
254b0 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
254c0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
254d0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254f0 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
25500 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
25530 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65  ) && winRetryIoe
25540 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
25550 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
25560 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65   !rc ){.      re
25570 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c  turn 0; /* Inval
25580 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20  id name? */.    
25590 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41 74  }.    attr = sAt
255a0 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
255b0 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c  ributes;.#if SQL
255c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
255d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74    }else{.    att
255e0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
255f0 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
25600 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
25610 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
25620 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f   (attr!=INVALID_
25630 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
25640 20 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41   && (attr&FILE_A
25650 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
25660 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  RY);.}../*.** Op
25670 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  en a file..*/.st
25680 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
25690 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
256a0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  *pVfs,        /*
256b0 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78   Used to get max
256c0 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c  imum path name l
256d0 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  ength */.  const
256e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
256f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25700 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
25710 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
25720 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
25730 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
25740 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
25750 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
25760 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
25770 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65      /* Open mode
25780 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
25790 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
257a0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
257b0 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a  return flags */.
257c0 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
257d0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
257e0 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77   = 0;.  DWORD dw
257f0 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20  DesiredAccess;. 
25800 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f   DWORD dwShareMo
25810 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72  de;.  DWORD dwCr
25820 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
25830 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  n;.  DWORD dwFla
25840 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
25850 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  = 0;.#if SQLITE_
25860 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69  OS_WINCE.  int i
25870 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69  sTemp = 0;.#endi
25880 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  f.  winFile *pFi
25890 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
258a0 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  d;.  void *zConv
258b0 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  erted;          
258c0 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
258d0 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a  in OS encoding *
258e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
258f0 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zUtf8Name = zNam
25900 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69  e; /* Filename i
25910 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67  n UTF-8 encoding
25920 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   */.  int cnt = 
25930 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  0;..  /* If argu
25940 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
25950 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
25960 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
25970 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
25980 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
25990 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
259a0 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
259b0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
259c0 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ..  */.  char *z
259d0 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20  Tmpname = 0; /* 
259e0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
259f0 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65 73  lename, if neces
25a00 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20  sary. */..  int 
25a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
25a30 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
25a40 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  de */.#if !defin
25a50 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51  ed(NDEBUG) || SQ
25a60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
25a70 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
25a80 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
25a90 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
25aa0 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  o open */.#endif
25ab0 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
25ac0 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
25ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
25ae0 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
25af0 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
25b00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
25b10 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
25b20 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
25b30 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
25b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
25b50 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
25b60 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
25b70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
25b80 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
25b90 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
25ba0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
25bb0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
25bc0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
25bd0 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72    int isOpenJour
25be0 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20  nal = (isCreate 
25bf0 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
25c00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
25c10 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20  MASTER_JOURNAL. 
25c20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
25c30 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
25c40 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65  OURNAL.     || e
25c50 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
25c60 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64  N_WAL.  ));.#end
25c70 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
25c80 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46  OPEN name=%s, pF
25c90 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78  ile=%p, flags=%x
25ca0 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e  , pOutFlags=%p\n
25cb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55  ",.           zU
25cc0 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61  tf8Name, id, fla
25cd0 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b  gs, pOutFlags));
25ce0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
25cf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
25d00 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 0a  ments are true:.
25d10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
25d20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
25d30 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
25d40 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
25d50 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
25d60 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
25d70 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
25d80 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
25d90 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
25da0 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
25db0 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
25dc0 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
25dd0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
25de0 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
25df0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
25e00 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
25e10 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
25e20 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
25e30 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
25e40 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
25e50 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
25e60 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
25e70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
25e80 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
25e90 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
25ea0 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
25eb0 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
25ec0 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
25ed0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
25ee0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
25ef0 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
25f00 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
25f10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
25f20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61  are never.  ** a
25f30 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
25f40 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
25f50 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
25f60 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
25f70 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
25f80 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
25f90 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
25fa0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
25fb0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
25fc0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
25fd0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
25fe0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
25ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
26000 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
26010 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
26020 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
26030 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
26040 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
26050 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
26060 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
26070 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
26080 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
26090 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
260a0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
260b0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
260c0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
260d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
260e0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
260f0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
26100 54 45 4d 50 5f 44 42 0a 20 20 20 20 20 20 20 7c  TEMP_DB.       |
26110 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
26120 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
26130 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
26140 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
26150 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65  RNAL.       || e
26160 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
26170 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
26180 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
26190 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
261a0 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  NAL.       || eT
261b0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
261c0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
261d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
261e0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
261f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
26200 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   );.  memset(pFi
26210 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  le, 0, sizeof(wi
26220 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  nFile));.  pFile
26230 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
26240 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66  NDLE_VALUE;..#if
26250 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
26260 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
26270 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65  e && !sqlite3_te
26280 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
26290 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
262a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20  SQLITE_ERROR,.  
262b0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74        "sqlite3_t
262c0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61  emp_directory va
262d0 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65  riable should be
262e0 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29   set for WinRT")
262f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
26300 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
26310 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
26320 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
26330 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 0a 20  LL, generate a. 
26340 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
26350 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20  le name to use. 
26360 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38   */.  if( !zUtf8
26370 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Name ){.    asse
26380 72 74 28 20 69 73 44 65 6c 65 74 65 20 26 26 20  rt( isDelete && 
26390 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29  !isOpenJournal )
263a0 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65  ;.    rc = winGe
263b0 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20  tTempname(pVfs, 
263c0 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  &zTmpname);.    
263d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
263e0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
263f0 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
26400 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38  s, rc=%s", zUtf8
26410 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Name, sqlite3Err
26420 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
26430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
26440 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65   }.    zUtf8Name
26450 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
26460 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ..  /* Database 
26470 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f  filenames are do
26480 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e  uble-zero termin
26490 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65  ated if they are
264a0 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77   not.  ** URIs w
264b0 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20  ith parameters. 
264c0 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e   Hence, they can
264d0 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65   always be passe
264e0 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  d into.  ** sqli
264f0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
26500 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
26510 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49  rt( (eType!=SQLI
26520 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
26530 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
26540 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
26550 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d  .       zUtf8Nam
26560 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
26570 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d  0(zUtf8Name)+1]=
26580 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  =0 );..  /* Conv
26590 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  ert the filename
265a0 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65   to the system e
265b0 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43  ncoding. */.  zC
265c0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
265d0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
265e0 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29  ename(zUtf8Name)
265f0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
26600 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
26610 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
26620 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
26630 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
26640 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
26650 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61  _NOMEM", zUtf8Na
26660 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
26670 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26680 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
26690 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
266a0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
266b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
266c0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73  onverted);.    s
266d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
266e0 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
266f0 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
26700 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e  s, rc=SQLITE_CAN
26710 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55  TOPEN_ISDIR", zU
26720 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
26730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
26740 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d  TOPEN_ISDIR;.  }
26750 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
26760 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
26770 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
26780 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
26790 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
267a0 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
267b0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
267c0 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
267d0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
267e0 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
267f0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
26800 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a  t a new file is.
26810 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
26820 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
26830 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
26840 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
26850 73 22 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73  s".  ** as it is
26860 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74   usually underst
26870 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ood..  */.  if( 
26880 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
26890 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20     /* Creates a 
268a0 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  new file, only i
268b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
268c0 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a  ready exist. */.
268d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
268e0 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61  le exists, it fa
268f0 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  ils. */.    dwCr
26900 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
26910 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a  n = CREATE_NEW;.
26920 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72    }else if( isCr
26930 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  eate ){.    /* O
26940 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c  pen existing fil
26950 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20  e, or create if 
26960 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  it doesn't exist
26970 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
26980 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
26990 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d  OPEN_ALWAYS;.  }
269a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  else{.    /* Ope
269b0 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20  ns a file, only 
269c0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
269d0 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
269e0 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
269f0 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
26a00 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
26a10 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
26a20 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
26a30 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65  ITE;..  if( isDe
26a40 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49  lete ){.#if SQLI
26a50 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
26a60 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
26a70 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
26a80 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
26a90 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
26aa0 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
26ab0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
26ac0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
26ad0 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26af0 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
26b00 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
26b30 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
26b40 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
26b50 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
26b60 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
26b70 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
26b80 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
26b90 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
26ba0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
26bb0 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
26bc0 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
26bd0 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
26be0 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
26bf0 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
26c00 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
26c10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
26c20 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
26c30 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
26c40 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
26c50 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a  ACCESS;.#endif..
26c60 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
26c70 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
26c80 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
26c90 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
26ca0 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
26cb0 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
26cc0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
26cd0 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
26ce0 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
26cf0 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
26d00 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
26d10 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
26d20 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
26d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
26d40 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
26d50 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
26d60 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
26d70 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
26d80 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
26d90 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
26da0 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
26db0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
26dc0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
26dd0 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
26de0 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
26df0 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
26e00 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
26e10 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
26e20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
26e30 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
26e40 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
26e50 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
26e60 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
26e70 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
26e80 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
26eb0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ed0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
26ee0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
26f10 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
26f40 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
26f50 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
26f60 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f80 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
26f90 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
26fa0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
26fb0 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
26fc0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
26fd0 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
26fe0 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
26ff0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
27020 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27040 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
27050 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
27080 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
27090 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
270c0 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
270f0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
27100 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
27130 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
27140 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
27150 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
27160 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
27170 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
27180 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
27190 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
271a0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
271b0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
271c0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271e0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
271f0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
27220 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27240 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
27250 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
27280 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
27290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
272c0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
272f0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
27300 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
27310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27320 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
27330 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69  .  }.#endif.  wi
27340 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f  nLogIoerr(cnt, _
27350 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20 20 4f 53 54  _LINE__);..  OST
27360 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65  RACE(("OPEN file
27370 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63  =%p, name=%s, ac
27380 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c  cess=%lx, rc=%s\
27390 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65  n", h, zUtf8Name
273a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44  ,.           dwD
273b0 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68  esiredAccess, (h
273c0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
273d0 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
273e0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
273f0 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
27400 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
27410 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
27420 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
27430 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
27440 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
27450 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
27460 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a  no, "winOpen", z
27470 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73  Utf8Name);.    s
27480 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
27490 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
274a0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
274b0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52  me);.    if( isR
274c0 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45  eadWrite && !isE
274d0 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
274e0 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e    return winOpen
274f0 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64  (pVfs, zName, id
27500 2c 0a 20 20 20 20 20 20 20 20 20 28 28 66 6c 61  ,.         ((fla
27510 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs|SQLITE_OPEN_R
27520 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20  EADONLY) &.     
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27540 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  ~(SQLITE_OPEN_CR
27550 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  EATE|SQLITE_OPEN
27560 5f 52 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20  _READWRITE)),.  
27570 20 20 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73         pOutFlags
27580 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
275a0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
275b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
275c0 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
275d0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
275e0 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75  te ){.      *pOu
275f0 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
27600 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
27610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27620 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
27630 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
27640 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LY;.    }.  }.. 
27650 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
27660 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
27670 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f  , access=%lx, pO
27680 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75  utFlags=%p, *pOu
27690 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20  tFlags=%d, ".   
276a0 20 20 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e          "rc=%s\n
276b0 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  ", h, zUtf8Name,
276c0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
276d0 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75  , pOutFlags, pOu
276e0 74 46 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20  tFlags ?.       
276f0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a      *pOutFlags :
27700 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f   0, (h==INVALID_
27710 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
27720 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
27730 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
27740 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73  S_WINCE.  if( is
27750 52 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79  ReadWrite && eTy
27760 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
27770 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26  MAIN_DB.       &
27780 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65  & (rc = winceCre
27790 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70  ateLock(zName, p
277a0 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f  File))!=SQLITE_O
277b0 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f  K.  ){.    osClo
277c0 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
277d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
277e0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73  onverted);.    s
277f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
27800 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
27810 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43  CE(("OPEN-CE-LOC
27820 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  K name=%s, rc=%s
27830 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69  \n", zName, sqli
27840 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
27850 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
27860 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d  .  }.  if( isTem
27870 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  p ){.    pFile->
27880 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d  zDeleteOnClose =
27890 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d   zConverted;.  }
278a0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
278b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
278c0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
278d0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
278e0 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70  e(zTmpname);.  p
278f0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
27900 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  &winIoMethod;.  
27910 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56  pFile->pVfs = pV
27920 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  fs;.  pFile->h =
27930 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64   h;.  if( isRead
27940 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c  only ){.    pFil
27950 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
27960 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a  WINFILE_RDONLY;.
27970 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
27980 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e  3_uri_boolean(zN
27990 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c  ame, "psow", SQL
279a0 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
279b0 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
279c0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
279d0 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57   |= WINFILE_PSOW
279e0 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
279f0 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
27a00 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50  ROR;.  pFile->zP
27a10 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66  ath = zName;.#if
27a20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27a30 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d  _SIZE>0.  pFile-
27a40 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
27a50 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
27a60 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  n = 0;.  pFile->
27a70 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
27a80 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
27a90 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69  ctual = 0;.  pFi
27aa0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
27ab0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
27ac0 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
27ad0 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e  ndif..  OpenCoun
27ae0 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
27af0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
27b00 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
27b10 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
27b20 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f   that Windows do
27b30 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
27b40 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
27b50 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
27b60 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
27b70 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
27b80 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
27b90 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
27ba0 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
27bb0 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
27bc0 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
27bd0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
27be0 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
27bf0 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
27c00 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
27c10 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
27c20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
27c30 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
27c40 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
27c50 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
27c60 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
27c70 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
27c80 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
27c90 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
27ca0 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
27cb0 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
27cc0 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
27cd0 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
27ce0 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
27cf0 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
27d00 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
27d10 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
27d20 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
27d30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
27d50 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
27d60 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
27d70 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
27d80 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
27d90 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
27da0 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
27db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
27dc0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
27dd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
27de0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
27df0 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44   DWORD attr;.  D
27e00 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
27e10 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
27e20 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
27e30 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
27e40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27e50 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a  ETER(syncDir);..
27e60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
27e70 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
27e80 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
27e90 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
27ea0 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44  E name=%s, syncD
27eb0 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e  ir=%d\n", zFilen
27ec0 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a  ame, syncDir));.
27ed0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
27ee0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
27ef0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
27f00 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
27f10 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
27f20 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
27f30 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  TE name=%s, rc=S
27f40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27f50 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  M\n", zFilename)
27f60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
27f70 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
27f80 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
27f90 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
27fa0 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45   do {.#if SQLITE
27fb0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
27fc0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
27fd0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
27fe0 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ata;.      memse
27ff0 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
28000 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
28010 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  a));.      if ( 
28020 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
28030 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65  tesExW(zConverte
28040 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f  d, GetFileExInfo
28050 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28070 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
28080 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20  trData) ){.     
28090 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
280a0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
280b0 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73  utes;.      }els
280c0 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  e{.        lastE
280d0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
280e0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
280f0 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
28100 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
28110 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
28120 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
28130 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
28140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28150 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
28160 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
28170 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
28180 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
28190 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
281a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
281b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
281c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
281d0 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20  else.      attr 
281e0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
281f0 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
28200 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
28210 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
28220 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
28230 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
28240 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
28250 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
28260 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
28270 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
28280 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
28290 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
282a0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
282b0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
282c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
282d0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
282e0 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
282f0 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
28300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
28310 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
28320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28340 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
28350 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
28360 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
28370 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28380 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
28390 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
283a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
283b0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
283c0 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
283d0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
283e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
283f0 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
28400 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
28410 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
28420 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
28430 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
28440 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
28450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
28460 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
28470 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
28480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28490 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
284a0 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
284b0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
284c0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
284d0 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
284e0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
284f0 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
28500 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
28510 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
28520 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
28530 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
28540 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
28550 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
28560 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
28570 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
28580 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
28590 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
285a0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
285b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
285c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
285d0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
285e0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
285f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28600 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
28610 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
28620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
28630 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
28640 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
28650 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
28660 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
28670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
28680 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
28690 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
286a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
286b0 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
286c0 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
286d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
286e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
286f0 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
28700 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28710 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
28720 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
28730 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
28740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
28750 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
28760 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
28770 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
28780 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
28790 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
287a0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
287b0 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  c && rc!=SQLITE_
287c0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
287d0 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  NT ){.    rc = w
287e0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
287f0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
28800 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44  lastErrno, "winD
28810 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d  elete", zFilenam
28820 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
28830 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
28840 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
28850 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
28860 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f  zConverted);.  O
28870 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
28880 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
28890 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  ", zFilename, sq
288a0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
288b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
288c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
288d0 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e  the existence an
288e0 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69  d status of a fi
288f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
28900 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73  t winAccess(.  s
28910 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
28920 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ,         /* Not
28930 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
28940 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28950 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f  zFilename,     /
28960 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
28970 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
28980 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
28990 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
289a0 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20  of test to make 
289b0 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
289c0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
289e0 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29  OUT: Result */.)
289f0 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
28a00 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
28a10 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
28a20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  = 0;.  void *zCo
28a30 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
28a40 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
28a50 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
28a60 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
28a70 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
28a80 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  S; );.  OSTRACE(
28a90 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
28aa0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73  , flags=%x, pRes
28ab0 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  Out=%p\n",.     
28ac0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
28ad0 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29   flags, pResOut)
28ae0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
28af0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
28b00 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
28b10 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
28b20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
28b30 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
28b40 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72  CCESS name=%s, r
28b50 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
28b60 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
28b70 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
28b80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
28b90 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
28ba0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
28bb0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
28bc0 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
28bd0 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
28be0 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
28bf0 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
28c00 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
28c10 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
28c20 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
28c30 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
28c40 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
28c50 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
28c80 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
28cb0 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
28cc0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
28cd0 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
28ce0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
28cf0 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
28d00 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
28d10 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
28d20 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
28d30 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
28d40 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
28d50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
28d60 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
28d70 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
28d80 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
28d90 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
28da0 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20  zeHigh==0.      
28db0 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
28dc0 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30  .nFileSizeLow==0
28dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
28de0 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
28df0 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
28e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28e10 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
28e20 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
28e30 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  es;.      }.    
28e40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e  }else{.      win
28e50 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f  LogIoerr(cnt, __
28e60 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69  LINE__);.      i
28e70 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  f( lastErrno!=ER
28e80 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
28e90 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21  ND && lastErrno!
28ea0 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
28eb0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
28ec0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28ed0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
28ee0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
28ef0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
28f00 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45  RR_ACCESS, lastE
28f10 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73  rrno, "winAccess
28f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46                zF
28f40 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
28f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
28f60 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
28f70 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
28f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28f90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
28fa0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
28fb0 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
28fc0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
28fd0 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
28fe0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
28ff0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
29000 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29010 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
29020 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
29030 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
29040 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
29050 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
29060 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
29070 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
29080 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
29090 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
290a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
290b0 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72  ADWRITE:.      r
290c0 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
290d0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
290e0 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  S &&.           
290f0 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41    (attr & FILE_A
29100 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c  TTRIBUTE_READONL
29110 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65  Y)==0;.      bre
29120 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
29130 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
29140 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
29150 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
29160 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
29170 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
29180 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f  S name=%s, pResO
29190 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d  ut=%p, *pResOut=
291a0 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %d, rc=SQLITE_OK
291b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
291c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f  zFilename, pResO
291d0 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a  ut, *pResOut));.
291e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
291f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
29200 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
29210 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
29220 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
29230 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74  with a drive let
29240 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  ter.** followed 
29250 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61  by a colon chara
29260 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
29270 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c  BOOL winIsDriveL
29280 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20  etterAndColon(. 
29290 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
292a0 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75  thname.){.  retu
292b0 72 6e 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c  rn ( sqlite3Isal
292c0 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  pha(zPathname[0]
292d0 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31  ) && zPathname[1
292e0 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ]==':' );.}../*.
292f0 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
29300 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
29310 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73  fied path name s
29320 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65  hould be used ve
29330 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e  rbatim.  If.** n
29340 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
29350 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ned from this fu
29360 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c  nction, the call
29370 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
29380 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20  t simply.** use 
29390 74 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74  the provided pat
293a0 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20  h name verbatim 
293b0 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20  -OR- resolve it 
293c0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
293d0 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74   name.** using t
293e0 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  he GetFullPathNa
293f0 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e  me Win32 API fun
29400 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61  ction (if availa
29410 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ble)..*/.static 
29420 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74  BOOL winIsVerbat
29430 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f  imPathname(.  co
29440 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  nst char *zPathn
29450 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  ame.){.  /*.  **
29460 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d   If the path nam
29470 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  e starts with a 
29480 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72  forward slash or
29490 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74   a backslash, it
294a0 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20   is either.  ** 
294b0 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65  a legal UNC name
294c0 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  , a volume relat
294d0 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20  ive path, or an 
294e0 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61  absolute path na
294f0 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  me in the.  ** "
29500 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20  Unix" format on 
29510 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20  Windows.  There 
29520 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74  is no easy way t
29530 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20  o differentiate 
29540 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
29550 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73   final two cases
29560 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20  ; therefore, we 
29570 72 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72  return the safer
29580 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
29590 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68   TRUE.  ** so th
295a0 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68  at callers of th
295b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
295c0 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76   simply use it v
295d0 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20  erbatim..  */.  
295e0 69 66 20 28 20 77 69 6e 49 73 44 69 72 53 65 70  if ( winIsDirSep
295f0 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29  (zPathname[0]) )
29600 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
29610 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
29620 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61  * If the path na
29630 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
29640 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f   letter and a co
29650 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72  lon it is either
29660 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72   a volume.  ** r
29670 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20  elative path or 
29680 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
29690 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68  .  Callers of th
296a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
296b0 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70   not.  ** attemp
296c0 74 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73  t to treat it as
296d0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
296e0 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79   name (i.e. they
296f0 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75   should simply u
29700 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61  se.  ** it verba
29710 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  tim)..  */.  if 
29720 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  ( winIsDriveLett
29730 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68  erAndColon(zPath
29740 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74  name) ){.    ret
29750 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
29760 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67   /*.  ** If we g
29770 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
29780 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  , the path name 
29790 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65  should almost ce
297a0 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72  rtainly be a pur
297b0 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ely.  ** relativ
297c0 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20  e one (i.e. not 
297d0 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20  a UNC name, not 
297e0 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f  absolute, and no
297f0 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  t volume relativ
29800 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  e)..  */.  retur
29810 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  n FALSE;.}../*.*
29820 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
29830 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
29840 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
29850 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
29860 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
29870 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
29880 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
29890 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
298a0 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
298b0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
298c0 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
298d0 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
298e0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
298f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
29900 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
29910 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29920 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
29930 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
29940 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
29950 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
29980 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
29990 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
299a0 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
299b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
299c0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
299d0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
299e0 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
299f0 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
29a00 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
29a10 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a  .  DWORD nByte;.
29a20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
29a30 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
29a40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
29a50 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65  f this path name
29a60 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58   begins with "/X
29a70 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73  :", where "X" is
29a80 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a   any alphabetic.
29a90 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
29aa0 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74  discard the init
29ab0 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65  ial "/" from the
29ac0 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   pathname..  */.
29ad0 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
29ae0 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e 49 73  0]=='/' && winIs
29af0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
29b00 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b 31 29  lon(zRelative+1)
29b10 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76   ){.    zRelativ
29b20 65 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66 20 64 65  e++;.  }..#if de
29b30 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
29b40 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
29b50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
29b60 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
29b70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
29b80 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  Full);.  assert(
29b90 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78   nFull>=pVfs->mx
29ba0 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66  Pathname );.  if
29bb0 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
29bc0 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
29bd0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
29be0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
29bf0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
29c00 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
29c10 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
29c20 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
29c30 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
29c40 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
29c50 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
29c60 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
29c70 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
29c80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
29c90 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
29ca0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
29cb0 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
29cc0 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
29cd0 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
29ce0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
29cf0 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68  tory and a slash
29d00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  ..    */.    cha
29d10 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
29d20 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
29d30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
29d40 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
29d50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29d60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
29d70 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
29d80 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
29d90 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
29da0 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
29db0 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
29dc0 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
29dd0 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20  _TO_WIN_A) |.   
29de0 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c           CCP_REL
29df0 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
29e00 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
29e10 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
29e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
29e30 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
29e40 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
29e50 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
29e60 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
29e70 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e90 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
29ea0 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
29eb0 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
29ec0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
29ed0 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
29ee0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
29ef0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
29f00 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
29f10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
29f20 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
29f30 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29f40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
29f50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
29f60 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
29f70 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
29f80 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
29f90 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fb0 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
29fc0 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
29fd0 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38 29 3b  irSep(), zUtf8);
29fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
29ff0 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
2a000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a010 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Out);.    }.  }e
2a020 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
2a030 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Out = sqlite3Mal
2a040 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d  locZero( pVfs->m
2a050 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20  xPathname+1 );. 
2a060 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a     if( !zOut ){.
2a070 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a080 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2a090 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2a0a0 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
2a0b0 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
2a0c0 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43    (osIsNT() ? CC
2a0d0 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
2a0e0 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
2a0f0 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20  WIN_A),.        
2a100 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a      zRelative, z
2a110 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  Out, pVfs->mxPat
2a120 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20  hname+1)<0 ){.  
2a130 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a140 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  (zOut);.      re
2a150 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2a160 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2a170 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52  _CONVPATH, (DWOR
2a180 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  D)errno,.       
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
2a1b0 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
2a1c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a1d0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d     char *zUtf8 =
2a1e0 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66   winConvertToUtf
2a1f0 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b  8Filename(zOut);
2a200 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66  .      if( !zUtf
2a210 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  8 ){.        sql
2a220 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2a230 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a240 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2a250 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
2a260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2a270 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2a280 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2a290 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2a2a0 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
2a2b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
2a2c0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
2a2d0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
2a2e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a2f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
2a300 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
2a310 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
2a320 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26  LITE_OS_WINRT) &
2a330 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
2a340 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
2a350 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2a360 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
2a370 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
2a380 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
2a390 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2a3a0 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
2a3b0 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52  ld. */.  /* WinR
2a3c0 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20  T has no way to 
2a3d0 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69  convert a relati
2a3e0 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62  ve path to an ab
2a3f0 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20  solute one. */. 
2a400 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
2a410 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
2a420 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
2a430 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
2a440 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
2a450 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
2a460 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
2a470 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2a480 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
2a490 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
2a4a0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
2a4b0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
2a4c0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
2a4d0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
2a4e0 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
2a4f0 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
2a500 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
2a510 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
2a520 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
2a530 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
2a540 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
2a550 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
2a560 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a570 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2a580 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a590 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
2a5a0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
2a5b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a5c0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
2a5d0 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
2a5e0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
2a5f0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2a600 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2a610 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2a620 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2a630 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
2a640 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2a650 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
2a660 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
2a670 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
2a680 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
2a690 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
2a6a0 5f 29 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  _).  /* It's odd
2a6b0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
2a6c0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
2a6d0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
2a6e0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
2a6f0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
2a700 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
2a710 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
2a720 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
2a730 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
2a740 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74  ling. This funct
2a750 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69  ion could fail i
2a760 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  f, for example, 
2a770 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
2a780 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f   working directo
2a790 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69  ry has been unli
2a7a0 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  nked..  */.  Sim
2a7b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2a7c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a7d0 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  R );.  if ( sqli
2a7e0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2a7f0 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
2a800 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
2a810 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
2a820 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
2a830 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2a840 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
2a850 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
2a860 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
2a870 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
2a880 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
2a890 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
2a8a0 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
2a8b0 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
2a8c0 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
2a8d0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
2a8e0 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
2a8f0 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
2a900 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
2a910 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
2a920 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
2a930 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2a940 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2a950 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2a960 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2a970 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a990 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
2a9a0 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
2a9b0 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65  Sep(), zRelative
2a9c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2a9d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a  LITE_OK;.  }.  z
2a9e0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
2a9f0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
2aa00 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
2aa10 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
2aa20 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
2aa30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2aa40 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2aa50 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
2aa60 20 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a   ){.    LPWSTR z
2aa70 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
2aa80 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2aa90 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
2aaa0 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
2aab0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2aac0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2aad0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2aae0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
2aaf0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2ab00 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2ab10 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
2ab20 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
2ab50 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74  thname1", zRelat
2ab60 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
2ab70 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20  nByte += 3;.    
2ab80 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d  zTemp = sqlite3M
2ab90 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
2aba0 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
2abb0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
2abc0 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
2abd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2abe0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2abf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2ac00 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2ac10 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
2ac20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
2ac30 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
2ac40 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
2ac50 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
2ac60 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2ac70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ac80 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2ac90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2aca0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
2acb0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2acc0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2acd0 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2ace0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2ad10 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
2ad20 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2ad30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ad40 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2ad50 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
2ad60 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
2ad70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ad80 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66  (zTemp);.  }.#if
2ad90 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2ada0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
2adb0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
2adc0 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
2add0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
2ade0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
2adf0 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
2ae00 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2ae10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ae20 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2ae30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ae40 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2ae50 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2ae60 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2ae70 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae90 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2aea0 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e3", zRelative);
2aeb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
2aec0 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
2aed0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2aee0 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
2aef0 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
2af00 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
2af10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2af20 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2af30 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
2af40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2af50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2af60 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2af70 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
2af80 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
2af90 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
2afa0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2afb0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2afc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2afd0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
2afe0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
2aff0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2b000 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2b010 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2b020 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2b030 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2b060 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e4", zRelative);
2b070 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2b080 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2b090 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
2b0a0 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54  winMbcsToUtf8(zT
2b0b0 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  emp, osAreFileAp
2b0c0 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 73  isANSI());.    s
2b0d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
2b0e0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  p);.  }.#endif. 
2b0f0 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20   if( zOut ){.   
2b100 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2b110 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2b120 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2b130 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
2b140 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2b150 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
2b160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2b180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2b190 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2b1a0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66   }.#endif.}..#if
2b1b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b1c0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
2b1d0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
2b1e0 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
2b1f0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
2b200 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
2b210 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
2b220 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
2b230 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
2b240 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
2b250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b260 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
2b270 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
2b280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2b290 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
2b2a0 68 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  h;.#if defined(_
2b2b0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74  _CYGWIN__).  int
2b2c0 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d   nFull = pVfs->m
2b2d0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63  xPathname+1;.  c
2b2e0 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c  har *zFull = sql
2b2f0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2b300 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20  nFull );.  void 
2b310 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b  *zConverted = 0;
2b320 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20  .  if( zFull==0 
2b330 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
2b340 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
2b350 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
2b360 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
2b370 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
2b380 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69   0;.  }.  if( wi
2b390 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  nFullPathname(pV
2b3a0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
2b3b0 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51  Full, zFull)!=SQ
2b3c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2b3d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
2b3e0 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  l);.    OSTRACE(
2b3f0 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
2b400 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
2b410 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
2b420 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
2b430 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76  n 0;.  }.  zConv
2b440 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
2b450 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
2b460 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c  me(zFull);.  sql
2b470 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29  ite3_free(zFull)
2b480 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a  ;.#else.  void *
2b490 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
2b4a0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
2b4b0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
2b4c0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
2b4d0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65  AMETER(pVfs);.#e
2b4e0 6e 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ndif.  if( zConv
2b4f0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
2b500 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
2b510 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
2b520 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
2b530 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20  e, (void*)0));. 
2b540 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2b550 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
2b560 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
2b570 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f  _WINRT.    h = o
2b580 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  sLoadPackagedLib
2b590 72 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43  rary((LPCWSTR)zC
2b5a0 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65  onverted, 0);.#e
2b5b0 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  lse.    h = osLo
2b5c0 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57  adLibraryW((LPCW
2b5d0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  STR)zConverted);
2b5e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
2b5f0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2b600 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
2b610 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
2b620 69 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a  ibraryA((char*)z
2b630 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
2b640 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
2b650 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25  (("DLOPEN name=%
2b660 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  s, handle=%p\n",
2b670 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69   zFilename, (voi
2b680 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65  d*)h));.  sqlite
2b690 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2b6a0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
2b6b0 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
2b6c0 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
2b6d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2b6e0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2b6f0 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
2b700 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b710 70 56 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c  pVfs);.  winGetL
2b720 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
2b730 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
2b740 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  uf, zBufOut);.}.
2b750 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69  static void (*wi
2b760 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  nDlSym(sqlite3_v
2b770 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70  fs *pVfs,void *p
2b780 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  H,const char *zS
2b790 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41  ym))(void){.  FA
2b7a0 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e  RPROC proc;.  UN
2b7b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b7c0 56 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f  Vfs);.  proc = o
2b7d0 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  sGetProcAddressA
2b7e0 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79  ((HANDLE)pH, zSy
2b7f0 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  m);.  OSTRACE(("
2b800 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c  DLSYM handle=%p,
2b810 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72   symbol=%s, addr
2b820 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ess=%p\n",.     
2b830 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c        (void*)pH,
2b840 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72   zSym, (void*)pr
2b850 6f 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  oc));.  return (
2b860 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72  void(*)(void))pr
2b870 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  oc;.}.static voi
2b880 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c  d winDlClose(sql
2b890 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2b8a0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
2b8b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b8c0 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72  ER(pVfs);.  osFr
2b8d0 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c  eeLibrary((HANDL
2b8e0 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53  E)pHandle);.  OS
2b8f0 54 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20  TRACE(("DLCLOSE 
2b900 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76  handle=%p\n", (v
2b910 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a  oid*)pHandle));.
2b920 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
2b930 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2b940 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
2b950 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
2b960 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
2b970 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
2b980 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
2b990 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
2b9a0 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
2b9b0 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53  e 0.#endif../* S
2b9c0 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
2b9d0 20 66 6f 72 20 74 68 65 20 72 61 6e 64 6f 6d 6e   for the randomn
2b9e0 65 73 73 20 67 61 74 68 65 72 65 72 2e 20 2a 2f  ess gatherer. */
2b9f0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2ba00 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20  EntropyGatherer 
2ba10 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 3b  EntropyGatherer;
2ba20 0a 73 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47  .struct EntropyG
2ba30 61 74 68 65 72 65 72 20 7b 0a 20 20 75 6e 73 69  atherer {.  unsi
2ba40 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 20 20 20  gned char *a;   
2ba50 2f 2a 20 47 61 74 68 65 72 20 65 6e 74 72 6f 70  /* Gather entrop
2ba60 79 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  y into this buff
2ba70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 3b 20  er */.  int na; 
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ba90 69 7a 65 20 6f 66 20 61 5b 5d 20 69 6e 20 62 79  ize of a[] in by
2baa0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  tes */.  int i; 
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bac0 58 4f 52 20 6e 65 78 74 20 69 6e 70 75 74 20 69  XOR next input i
2bad0 6e 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20 20 69 6e  nto a[i] */.  in
2bae0 74 20 6e 58 6f 72 3b 20 20 20 20 20 20 20 20 20  t nXor;         
2baf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 58    /* Number of X
2bb00 4f 52 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f  OR operations do
2bb10 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 21 64  ne */.};..#if !d
2bb20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2bb30 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ST) && !defined(
2bb40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
2bb50 4f 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69 78 20 73  OMNESS)./* Mix s
2bb60 7a 20 62 79 74 65 73 20 6f 66 20 65 6e 74 72 6f  z bytes of entro
2bb70 70 79 20 69 6e 74 6f 20 70 2e 20 2a 2f 0a 73 74  py into p. */.st
2bb80 61 74 69 63 20 76 6f 69 64 20 78 6f 72 4d 65 6d  atic void xorMem
2bb90 6f 72 79 28 45 6e 74 72 6f 70 79 47 61 74 68 65  ory(EntropyGathe
2bba0 72 65 72 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  rer *p, unsigned
2bbb0 20 63 68 61 72 20 2a 78 2c 20 69 6e 74 20 73 7a   char *x, int sz
2bbc0 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  ){.  int j, k;. 
2bbd0 20 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70 2d 3e 69   for(j=0, k=p->i
2bbe0 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b 0a 20 20  ; j<sz; j++){.  
2bbf0 20 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e 3d 20 78    p->a[k++] ^= x
2bc00 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d  [j];.    if( k>=
2bc10 70 2d 3e 6e 61 20 29 20 6b 20 3d 20 30 3b 0a 20  p->na ) k = 0;. 
2bc20 20 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b 3b 0a 20   }.  p->i = k;. 
2bc30 20 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73 7a 3b 0a   p->nXor += sz;.
2bc40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
2bc50 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2bc60 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
2bc70 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d  LITE_OMIT_RANDOM
2bc80 4e 45 53 53 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NESS) */../*.** 
2bc90 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66  Write up to nBuf
2bca0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
2bcb0 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a  ness into zBuf..
2bcc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2bcd0 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  nRandomness(sqli
2bce0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2bcf0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2bd00 42 75 66 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  Buf){.#if define
2bd10 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c  d(SQLITE_TEST) |
2bd20 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
2bd30 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53  _OMIT_RANDOMNESS
2bd40 29 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ).  UNUSED_PARAM
2bd50 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65  ETER(pVfs);.  me
2bd60 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
2bd70 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 42  uf);.  return nB
2bd80 75 66 3b 0a 23 65 6c 73 65 0a 20 20 45 6e 74 72  uf;.#else.  Entr
2bd90 6f 70 79 47 61 74 68 65 72 65 72 20 65 3b 0a 20  opyGatherer e;. 
2bda0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2bdb0 52 28 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65  R(pVfs);.  memse
2bdc0 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
2bdd0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d  ;.#if defined(_M
2bde0 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f  SC_VER) && _MSC_
2bdf0 56 45 52 3e 3d 31 34 30 30 20 26 26 20 21 53 51  VER>=1400 && !SQ
2be00 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
2be10 72 61 6e 64 5f 73 28 28 75 6e 73 69 67 6e 65 64  rand_s((unsigned
2be20 20 69 6e 74 2a 29 7a 42 75 66 29 3b 20 2f 2a 20   int*)zBuf); /* 
2be30 72 61 6e 64 5f 73 28 29 20 69 73 20 6e 6f 74 20  rand_s() is not 
2be40 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 4d  available with M
2be50 69 6e 47 57 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  inGW */.#endif /
2be60 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  * defined(_MSC_V
2be70 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e  ER) && _MSC_VER>
2be80 3d 31 34 30 30 20 2a 2f 0a 20 20 65 2e 61 20 3d  =1400 */.  e.a =
2be90 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2bea0 29 7a 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20  )zBuf;.  e.na = 
2beb0 6e 42 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d  nBuf;.  e.nXor =
2bec0 20 30 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20   0;.  e.i = 0;. 
2bed0 20 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d   {.    SYSTEMTIM
2bee0 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79  E x;.    osGetSy
2bef0 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
2bf00 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2bf10 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2bf20 26 78 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45  &x, sizeof(SYSTE
2bf30 4d 54 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b  MTIME));.  }.  {
2bf40 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
2bf50 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
2bf60 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f  cessId();.    xo
2bf70 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2bf80 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64  igned char*)&pid
2bf90 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  , sizeof(DWORD))
2bfa0 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
2bfb0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20  _OS_WINRT.  {.  
2bfc0 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20    ULONGLONG cnt 
2bfd0 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
2bfe0 36 34 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  64();.    xorMem
2bff0 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2c000 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69  d char*)&cnt, si
2c010 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29  zeof(ULONGLONG))
2c020 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  ;.  }.#else.  {.
2c030 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
2c040 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
2c050 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2c060 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2c070 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66  ar*)&cnt, sizeof
2c080 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65  (DWORD));.  }.#e
2c090 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2c0a0 53 5f 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20  S_WINRT */.  {. 
2c0b0 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
2c0c0 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
2c0d0 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
2c0e0 72 28 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65  r(&i);.    xorMe
2c0f0 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e  mory(&e, (unsign
2c100 65 64 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a  ed char*)&i, siz
2c110 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
2c120 52 29 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51  R));.  }.#if !SQ
2c130 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2c140 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2c150 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
2c160 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20  2_USE_UUID.  {. 
2c170 20 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20     UUID id;.    
2c180 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73  memset(&id, 0, s
2c190 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2c1a0 20 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26    osUuidCreate(&
2c1b0 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  id);.    xorMemo
2c1c0 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2c1d0 20 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65   char*)&id, size
2c1e0 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d  of(UUID));.    m
2c1f0 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69  emset(&id, 0, si
2c200 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20  zeof(UUID));.   
2c210 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
2c220 75 65 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20  uential(&id);.  
2c230 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2c240 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2c250 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  &id, sizeof(UUID
2c260 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ));.  }.#endif /
2c270 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  * !SQLITE_OS_WIN
2c280 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
2c290 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
2c2a0 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20  _WIN32_USE_UUID 
2c2b0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58  */.  return e.nX
2c2c0 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a  or>nBuf ? nBuf :
2c2d0 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20   e.nXor;.#endif 
2c2e0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
2c2f0 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
2c300 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2c310 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a  ANDOMNESS) */.}.
2c320 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
2c330 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
2c340 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
2c350 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
2c360 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
2c370 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
2c380 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2c390 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
2c3a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
2c3b0 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
2c3c0 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
2c3d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2c3e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
2c3f0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
2c400 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
2c410 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2c420 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2c430 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2c440 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2c450 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2c460 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2c470 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2c480 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2c490 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2c4a0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2c4b0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2c4c0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2c4d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2c4e0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2c4f0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2c500 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2c510 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2c520 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2c530 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2c540 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2c550 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2c560 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2c570 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2c580 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2c590 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2c5a0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2c5b0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2c5c0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2c5d0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2c5e0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2c5f0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2c600 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2c610 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2c620 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2c630 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2c640 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2c650 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2c660 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2c670 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2c680 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2c690 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2c6a0 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2c6b0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2c6c0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a  e time and date.
2c6d0 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
2c6e0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2c6f0 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2c700 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
2c710 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
2c720 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2c730 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
2c740 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
2c750 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
2c760 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
2c770 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61  r of.     100-na
2c780 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
2c790 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
2c7a0 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
2c7b0 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a  305813.5)..  */.
2c7c0 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
2c7d0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2c7e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
2c7f0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
2c800 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
2c810 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2c820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2c830 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
2c840 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2c850 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
2c860 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
2c870 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
2c880 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
2c890 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
2c8a0 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
2c8b0 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
2c8c0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2c8d0 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
2c8e0 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71  alue =.      (sq
2c8f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2c900 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
2c910 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
2c920 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
2c930 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
2c940 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
2c950 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
2c960 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
2c970 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2c980 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
2c990 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2c9a0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
2c9b0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
2c9c0 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
2c9d0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
2c9e0 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
2c9f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2ca00 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
2ca10 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2ca20 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
2ca30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
2ca40 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
2ca50 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
2ca60 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
2ca70 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
2ca80 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
2ca90 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20  itValue) +.     
2caa0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2cab0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
2cac0 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
2cad0 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
2cae0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2caf0 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2cb00 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2cb10 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2cb20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2cb30 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2cb40 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2cb50 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2cb60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2cb70 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2cb80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2cb90 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2cba0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2cbb0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2cbc0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2cbd0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
2cbe0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2cbf0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2cc00 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
2cc10 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
2cc20 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2cc30 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2cc40 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2cc50 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2cc60 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2cc70 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2cc80 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
2cc90 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
2cca0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2ccb0 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
2ccc0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
2ccd0 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
2cce0 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
2ccf0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2cd00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2cd10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2cd20 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
2cd30 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
2cd40 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
2cd50 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
2cd60 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
2cd70 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
2cd80 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
2cd90 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
2cda0 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
2cdb0 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
2cdc0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
2cdd0 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
2cde0 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2cdf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
2ce00 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
2ce10 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
2ce20 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
2ce30 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
2ce40 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
2ce50 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
2ce60 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2ce70 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
2ce80 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
2ce90 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
2cea0 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
2ceb0 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
2cec0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
2ced0 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
2cee0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2cef0 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
2cf00 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
2cf10 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
2cf20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
2cf30 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
2cf40 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
2cf50 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
2cf60 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
2cf70 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
2cf80 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
2cf90 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
2cfa0 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
2cfb0 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
2cfc0 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
2cfd0 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
2cfe0 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
2cff0 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
2d000 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
2d010 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
2d020 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
2d030 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
2d040 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
2d050 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
2d060 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
2d070 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
2d080 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
2d090 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
2d0a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
2d0b0 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
2d0c0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
2d0d0 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
2d0e0 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
2d0f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2d100 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2d110 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
2d120 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
2d130 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
2d140 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
2d150 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
2d160 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2d170 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
2d180 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
2d190 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
2d1a0 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
2d1b0 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
2d1c0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2d1d0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
2d1e0 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
2d1f0 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
2d200 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
2d210 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
2d220 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
2d230 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2d240 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2d250 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2d260 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
2d270 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55  LastError();.  U
2d280 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2d290 70 56 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75  pVfs);.  if( nBu
2d2a0 66 3e 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74  f>0 ) winGetLast
2d2b0 45 72 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66  ErrorMsg(e, nBuf
2d2c0 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72  , zBuf);.  retur
2d2d0 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n e;.}../*.** In
2d2e0 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
2d2f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
2d300 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
2d310 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
2d320 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
2d330 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2d340 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2d350 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d370 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
2d380 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
2d390 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
2d3a0 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49  File */.    SQLI
2d3b0 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
2d3c0 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61  H_BYTES, /* mxPa
2d3d0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
2d400 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20     "win32",     
2d410 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
2d420 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d440 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
2d450 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
2d460 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2d470 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2d480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
2d490 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
2d4a0 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
2d4b0 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
2d4c0 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
2d4d0 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
2d4e0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2d4f0 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2d500 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
2d510 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
2d520 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
2d530 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
2d540 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
2d550 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
2d560 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
2d570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2d580 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
2d590 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
2d5a0 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2d5b0 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2d5c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2d5d0 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
2d5e0 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
2d5f0 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2d600 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
2d610 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
2d620 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2d630 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2d640 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
2d650 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2d660 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79   */.    winSetSy
2d670 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
2d680 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
2d690 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
2d6a0 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47  emCall,    /* xG
2d6b0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
2d6c0 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
2d6d0 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78  mCall,   /* xNex
2d6e0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2d6f0 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   };.#if defined(
2d700 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2d710 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63 20  _WIDE).  static 
2d720 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c  sqlite3_vfs winL
2d730 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20  ongPathVfs = {. 
2d740 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
2d750 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2d760 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
2d770 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20  f(winFile),     
2d780 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
2d790 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f     SQLITE_WINNT_
2d7a0 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20  MAX_PATH_BYTES, 
2d7b0 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
2d7c0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2d7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2d7e0 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2d7f0 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 2f  -longpath",    /
2d800 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
2d810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d820 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
2d830 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20  */.    winOpen, 
2d840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2d850 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2d860 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2d870 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
2d880 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
2d890 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2d8a0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
2d8b0 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
2d8c0 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
2d8d0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e  */.    winDlOpen
2d8e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2d8f0 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
2d900 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
2d910 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2d920 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2d930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2d940 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
2d950 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
2d960 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
2d970 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73      winRandomnes
2d980 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
2d990 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
2d9a0 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
2d9b0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
2d9c0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2d9d0 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
2d9e0 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
2d9f0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2da00 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
2da10 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  tError */.    wi
2da20 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2da30 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
2da40 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
2da50 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
2da60 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2da70 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2da80 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2da90 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
2daa0 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
2dab0 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
2dac0 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61  /* xNextSystemCa
2dad0 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69  ll */.  };.#endi
2dae0 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  f..  /* Double-c
2daf0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
2db00 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
2db10 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
2db20 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
2db30 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
2db40 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
2db50 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
2db60 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
2db70 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f  all)==80 );..  /
2db80 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70  * get memory map
2db90 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e   allocation gran
2dba0 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d  ularity */.  mem
2dbb0 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c  set(&winSysInfo,
2dbc0 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45   0, sizeof(SYSTE
2dbd0 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51  M_INFO));.#if SQ
2dbe0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2dbf0 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
2dc00 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
2dc10 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65  o);.#else.  osGe
2dc20 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  tSystemInfo(&win
2dc30 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  SysInfo);.#endif
2dc40 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
2dc50 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
2dc60 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20  onGranularity>0 
2dc70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  );.  assert( win
2dc80 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
2dc90 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ze>0 );..  sqlit
2dca0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
2dcb0 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69  &winVfs, 1);..#i
2dcc0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2dcd0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2dce0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
2dcf0 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67  egister(&winLong
2dd00 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e  PathVfs, 0);.#en
2dd10 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
2dd20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20  LITE_OK;.}..int 
2dd30 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
2dd40 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  oid){.#if SQLITE
2dd50 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
2dd60 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
2dd70 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
2dd80 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20  dle(sleepObj);. 
2dd90 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55     sleepObj = NU
2dda0 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  LL;.  }.#endif. 
2ddb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ddc0 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
2ddd0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f  SQLITE_OS_WIN */
2dde0 0a                                               .