/ Hex Artifact Content
Login

Artifact 47687775641c97743c228f99813fbcffe7d53602da5cdcf0fe52f6810341a46c:


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 54 68 65 20 77 69 6e 56 66 73 41 70 70 44  * The winVfsAppD
23f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
2400: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 41   used for the pA
2410: 70 70 44 61 74 61 20 6d 65 6d 62 65 72 20 66 6f  ppData member fo
2420: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
2430: 57 69 6e 33 32 20 56 46 53 20 76 61 72 69 61 6e  Win32 VFS varian
2440: 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ts..*/.typedef s
2450: 74 72 75 63 74 20 77 69 6e 56 66 73 41 70 70 44  truct winVfsAppD
2460: 61 74 61 20 77 69 6e 56 66 73 41 70 70 44 61 74  ata winVfsAppDat
2470: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 56 66 73  a;.struct winVfs
2480: 41 70 70 44 61 74 61 20 7b 0a 20 20 63 6f 6e 73  AppData {.  cons
2490: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
24a0: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f  hods *pMethod; /
24b0: 2a 20 54 68 65 20 66 69 6c 65 20 49 2f 4f 20 6d  * The file I/O m
24c0: 65 74 68 6f 64 73 20 74 6f 20 75 73 65 2e 20 2a  ethods to use. *
24d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 70 70 44 61  /.  void *pAppDa
24e0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
24f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
2500: 74 72 61 20 70 41 70 70 44 61 74 61 2c 20 69 66  tra pAppData, if
2510: 20 61 6e 79 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20   any. */.  BOOL 
2520: 62 4e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNoLock;        
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2540: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6c 6f 63   Non-zero if loc
2550: 6b 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  king is disabled
2560: 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  . */.};../*.** A
2570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
2580: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c  r winFile.ctrlFl
2590: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ags.*/.#define W
25a0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  INFILE_RDONLY   
25b0: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a         0x02   /*
25c0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
25d0: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
25e0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
25f0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
2600: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2610: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
2620: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
2630: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
2640: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
2650: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
2660: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
2670: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
2680: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
2690: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
26a0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
26b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26c0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
26d0: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
26e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
26f0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
2700: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
2710: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
2720: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2730: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2740: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
2750: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
2760: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74   that. * the dat
2770: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  a directory shou
2780: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
2790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
27a0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
27b0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
27c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
27d0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
27e0: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69  Y_TYPE (1).#endi
27f0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2800: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2810: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
2820: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
2830: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
2840: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
2850: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
2860: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
2870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2880: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
2890: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
28a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
28b0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
28c0: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (2).#endif../*.
28d0: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77   * If compiled w
28e0: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ith SQLITE_WIN32
28f0: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f  _MALLOC on Windo
2900: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20  ws, we will use 
2910: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57  the. * various W
2920: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75  in32 API heap fu
2930: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20  nctions instead 
2940: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a  of our own.. */.
2950: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2960: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20  N32_MALLOC../*. 
2970: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e  * If this is non
2980: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74  -zero, an isolat
2990: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
29a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  created by the n
29b0: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61  ative Win32. * a
29c0: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74  llocator subsyst
29d0: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  em; otherwise, t
29e0: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65  he default proce
29f0: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ss heap will be 
2a00: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73  used.  This. * s
2a10: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66  etting has no ef
2a20: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  fect when compil
2a30: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20  ing for WinRT.  
2a40: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
2a50: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61   is enabled. * a
2a60: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  nd an isolated h
2a70: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
2a80: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c  ted to store all
2a90: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e   allocated data.
2aa0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . *. ***********
2ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af0: 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20  ***. * WARNING: 
2b00: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2b10: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65  to note that whe
2b20: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69  n this setting i
2b30: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2b40: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77  he. *          w
2b50: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75  inMemShutdown fu
2b60: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2b70: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71   (e.g. by the sq
2b80: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
2b90: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74  *          funct
2ba0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74  ion), all data t
2bb0: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  hat was allocate
2bc0: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c  d using the isol
2bd0: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20  ated heap will. 
2be0: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72  *          be fr
2bf0: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  eed immediately 
2c00: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20  and any attempt 
2c10: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66  to access any of
2c20: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20   that freed. *  
2c30: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c          data wil
2c40: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  l almost certain
2c50: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
2c60: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73  immediate access
2c70: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a   violation.. ***
2c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a  ***********. */.
2cd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2ce0: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
2cf0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2d00: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2d10: 41 54 45 20 20 20 20 20 20 20 20 28 54 52 55 45  ATE        (TRUE
2d20: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2d30: 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 78 69  This is the maxi
2d40: 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 69 6e 69  mum possible ini
2d50: 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tial size of the
2d60: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20   Win32-specific 
2d70: 68 65 61 70 2c 20 69 6e 0a 20 2a 20 62 79 74 65  heap, in. * byte
2d80: 73 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  s.. */.#ifndef S
2d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2da0: 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  _MAX_INIT_SIZE.#
2db0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2dc0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49  WIN32_HEAP_MAX_I
2dd0: 4e 49 54 5f 53 49 5a 45 20 28 34 32 39 34 39 36  NIT_SIZE (429496
2de0: 37 32 39 35 55 29 0a 23 65 6e 64 69 66 0a 0a 2f  7295U).#endif../
2df0: 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74 68 65  *. * This is the
2e00: 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f 72   extra space for
2e10: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   the initial siz
2e20: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
2e30: 70 65 63 69 66 69 63 20 68 65 61 70 2c 0a 20 2a  pecific heap,. *
2e40: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
2e50: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
2e60: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
2e70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2e80: 50 5f 49 4e 49 54 5f 45 58 54 52 41 0a 23 20 20  P_INIT_EXTRA.#  
2e90: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2ea0: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45 58  N32_HEAP_INIT_EX
2eb0: 54 52 41 20 20 28 34 31 39 34 33 30 34 29 0a 23  TRA  (4194304).#
2ec0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 43 61 6c  endif../*. * Cal
2ed0: 63 75 6c 61 74 65 20 74 68 65 20 6d 61 78 69 6d  culate the maxim
2ee0: 75 6d 20 6c 65 67 61 6c 20 63 61 63 68 65 20 73  um legal cache s
2ef0: 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 62  ize, in pages, b
2f00: 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 78 69  ased on the maxi
2f10: 6d 75 6d 0a 20 2a 20 70 6f 73 73 69 62 6c 65 20  mum. * possible 
2f20: 69 6e 69 74 69 61 6c 20 68 65 61 70 20 73 69 7a  initial heap siz
2f30: 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c  e and the defaul
2f40: 74 20 70 61 67 65 20 73 69 7a 65 2c 20 73 65 74  t page size, set
2f50: 74 69 6e 67 20 61 73 69 64 65 20 74 68 65 0a 20  ting aside the. 
2f60: 2a 20 6e 65 65 64 65 64 20 65 78 74 72 61 20 73  * needed extra s
2f70: 70 61 63 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  pace.. */.#ifnde
2f80: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
2f90: 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  AX_CACHE_SIZE.# 
2fa0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2fb0: 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f 53  IN32_MAX_CACHE_S
2fc0: 49 5a 45 20 20 20 28 28 28 53 51 4c 49 54 45 5f  IZE   (((SQLITE_
2fd0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49  WIN32_HEAP_MAX_I
2fe0: 4e 49 54 5f 53 49 5a 45 29 20 2d 20 5c 0a 20 20  NIT_SIZE) - \.  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
3020: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
3030: 45 58 54 52 41 29 29 20 2f 20 5c 0a 20 20 20 20  EXTRA)) / \.    
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46       (SQLITE_DEF
3070: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 29  AULT_PAGE_SIZE))
3080: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
3090: 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a  his is cache siz
30a0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61  e used in the ca
30b0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  lculation of the
30c0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
30d0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70   the. * Win32-sp
30e0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74  ecific heap.  It
30f0: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74   cannot be negat
3100: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ive.. */.#ifndef
3110: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41   SQLITE_WIN32_CA
3120: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53  CHE_SIZE.#  if S
3130: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
3140: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20  CHE_SIZE>=0.#   
3150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3160: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
3170: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
3180: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 0a  ULT_CACHE_SIZE).
3190: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
31a0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
31b0: 5f 43 41 43 48 45 5f 53 49 5a 45 20 20 20 20 20  _CACHE_SIZE     
31c0: 28 2d 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  (-(SQLITE_DEFAUL
31d0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 29 0a 23  T_CACHE_SIZE)).#
31e0: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
31f0: 2f 2a 0a 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*. * Make sure 
3200: 74 68 61 74 20 74 68 65 20 63 61 6c 63 75 6c 61  that the calcula
3210: 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 2c 20  ted cache size, 
3220: 69 6e 20 70 61 67 65 73 2c 20 63 61 6e 6e 6f 74  in pages, cannot
3230: 20 63 61 75 73 65 20 74 68 65 0a 20 2a 20 69 6e   cause the. * in
3240: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
3250: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
3260: 20 68 65 61 70 20 74 6f 20 65 78 63 65 65 64 20   heap to exceed 
3270: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
3280: 6e 74 0a 20 2a 20 6f 66 20 6d 65 6d 6f 72 79 20  nt. * of memory 
3290: 74 68 61 74 20 63 61 6e 20 62 65 20 73 70 65 63  that can be spec
32a0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61 6c  ified in the cal
32b0: 6c 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 2e  l to HeapCreate.
32c0: 0a 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
32d0: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
32e0: 3e 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  >SQLITE_WIN32_MA
32f0: 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20 20  X_CACHE_SIZE.#  
3300: 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  undef SQLITE_WIN
3310: 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  32_CACHE_SIZE.# 
3320: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3330: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
3340: 20 20 20 20 20 20 28 32 30 30 30 29 0a 23 65 6e        (2000).#en
3350: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  dif../*. * The i
3360: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
3370: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
3380: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
3390: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
33a0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
33b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
33c0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
33d0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
33e0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 20  HEAP_INIT_SIZE  
33f0: 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   ((SQLITE_WIN32_
3400: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a  CACHE_SIZE) * \.
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
3440: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
3450: 5a 45 29 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  ZE) + \.        
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48   (SQLITE_WIN32_H
3490: 45 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 29 29  EAP_INIT_EXTRA))
34a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
34b0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
34c0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
34d0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
34e0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
34f0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
3500: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
3510: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
3520: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
3530: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
3540: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
3550: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
3560: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
3570: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
3580: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
3590: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
35a0: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
35b0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
35c0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
35d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
35e0: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
35f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
3600: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 20 20 28  AP_FLAGS       (
3610: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0).#endif.../*.*
3620: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
3630: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
3640: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
3650: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
3660: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
3670: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3680: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
3690: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
36a0: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
36b0: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
36c0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
36d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
36e0: 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20    u32 magic1;   
36f0: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
3700: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
3710: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
3720: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
3730: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
3740: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
3750: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
3760: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
3770: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
3780: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
3790: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
37a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
37b0: 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f   u32 magic2;   /
37c0: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
37d0: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
37e0: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
37f0: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66  /.#endif.};..#if
3800: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
3810: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
3820: 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62  1     0x42b2830b
3830: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f  .#define WINMEM_
3840: 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34  MAGIC2     0xbd4
3850: 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74  d7cf4.#endif..st
3860: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
3870: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
3880: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
3890: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
38a0: 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20  MAGIC1,.#endif. 
38b0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66   NULL, FALSE.#if
38c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57  ndef NDEBUG.  ,W
38d0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e  INMEM_MAGIC2.#en
38e0: 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  dif.};..#ifndef 
38f0: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
3900: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3910: 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  1() assert( win_
3920: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d  mem_data.magic1=
3930: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
3940: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
3950: 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73  ssertMagic2() as
3960: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
3970: 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  ta.magic2==WINME
3980: 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69  M_MAGIC2 ).#defi
3990: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
39a0: 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73  agic()  winMemAs
39b0: 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69  sertMagic1(); wi
39c0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32  nMemAssertMagic2
39d0: 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ();.#else.#defin
39e0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
39f0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
3a00: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44  efine winMemGetD
3a10: 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d  ataPtr()  &win_m
3a20: 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20  em_data.#define 
3a30: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
3a40: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
3a50: 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77  .hHeap.#define w
3a60: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
3a70: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
3a80: 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76  bOwned..static v
3a90: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
3aa0: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
3ab0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
3ac0: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
3ad0: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
3ae0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
3af0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
3b00: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
3b10: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
3b20: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
3b30: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
3b40: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
3b50: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
3b60: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
3b70: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
3b80: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
3b90: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
3ba0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
3bb0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
3bc0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
3bd0: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
3be0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
3bf0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
3c00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
3c10: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
3c20: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
3c30: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
3c40: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
3c50: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
3c60: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
3c70: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
3c80: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
3c90: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
3ca0: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
3cb0: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
3cc0: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
3cd0: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
3ce0: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3cf0: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
3d00: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
3d10: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
3d20: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
3d30: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
3d40: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
3d50: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
3d60: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
3d70: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
3d80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3d90: 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45 5f  EST.LONG SQLITE_
3da0: 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73  WIN32_VOLATILE s
3db0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
3dc0: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
3dd0: 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e   LONG SQLITE_WIN
3de0: 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69  32_VOLATILE sqli
3df0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
3e00: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3e10: 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69   SYSCALL.#  defi
3e20: 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74  ne SYSCALL sqlit
3e30: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23  e3_syscall_ptr.#
3e40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
3e50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
3e60: 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  t available on W
3e70: 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e  indows CE or Win
3e80: 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  RT.. */..#if SQL
3e90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
3ea0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
3eb0: 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46  #  define osAreF
3ec0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20  ileApisANSI()   
3ed0: 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a      1.#endif../*
3ee0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
3ef0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
3f00: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
3f10: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
3f20: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
3f30: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
3f40: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
3f50: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
3f60: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
3f70: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
3f80: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
3f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
3fa0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
3fb0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
3fc0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
3fd0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
3fe0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
3ff0: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
4000: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
4010: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
4020: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4030: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
4040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
4050: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
4060: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
4070: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
4080: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
4090: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
40a0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
40b0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
40c0: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66  yscall[] = {.#if
40d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
40e0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
40f0: 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69  WINRT.  { "AreFi
4100: 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20  leApisANSI",    
4110: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72       (SYSCALL)Ar
4120: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20  eFileApisANSI,  
4130: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4140: 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  e.  { "AreFileAp
4150: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
4160: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4190: 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c  #ifndef osAreFil
41a0: 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e  eApisANSI.#defin
41b0: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  e osAreFileApisA
41c0: 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  NSI ((BOOL(WINAP
41d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
41e0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
41f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
4200: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4210: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4220: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4230: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20  { "CharLowerW", 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4250: 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57  SCALL)CharLowerW
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
4270: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
4280: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
4290: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
42a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
42b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
42c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
42d0: 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c  osCharLowerW ((L
42e0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
42f0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
4300: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4310: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4320: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
4330: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4340: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70  DE).  { "CharUpp
4350: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
4360: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
4370: 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20  UpperW,         
4380: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4390: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
43a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
43b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
43e0: 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65  efine osCharUppe
43f0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
4400: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
4410: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
4420: 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61  t)..  { "CloseHa
4430: 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  ndle",          
4440: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73     (SYSCALL)Clos
4450: 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  eHandle,        
4460: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4470: 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ne osCloseHandle
4480: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4490: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
44a0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
44b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
44c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
44d0: 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  I).  { "CreateFi
44e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
44f0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
4500: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
4510: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4520: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
4530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4540: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4570: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
4580: 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  eA ((HANDLE(WINA
4590: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
45a0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
45b0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
45c0: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
45d0: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
45e0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
45f0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4600: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4610: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4620: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4630: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20  CreateFileW",   
4640: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4650: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20  LL)CreateFileW, 
4660: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4670: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
4680: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
46c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
46d0: 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e  reateFileW ((HAN
46e0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
46f0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
4700: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
4710: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4720: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
4730: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
4740: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4750: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4760: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
4770: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4780: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
4790: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
47a0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
47b0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
47c0: 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20 20  IZE>0) && \.    
47d0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
47e0: 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49  _CREATEFILEMAPPI
47f0: 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NGA.  { "CreateF
4800: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
4810: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
4820: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20  teFileMappingA, 
4830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4840: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
4850: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
4860: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4890: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
48a0: 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e  leMappingA ((HAN
48b0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
48c0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
48d0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
48e0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
48f0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61  ,DWORD,LPCSTR))a
4900: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
4910: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4920: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
4930: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4940: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4950: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4960: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
4970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4980: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4990: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
49a0: 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  >0)).  { "Create
49b0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
49c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
49d0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
49e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
49f0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
4a00: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
4a10: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4a40: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
4a50: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
4a60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
4a70: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
4a80: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
4a90: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
4aa0: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
4ab0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
4ac0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4ad0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4ae0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4af0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4b00: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
4b10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4b20: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
4b30: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
4b40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4b50: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
4b60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4b70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4ba0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
4bb0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4bc0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
4bd0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
4be0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
4bf0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
4c00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4c30: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
4c40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c50: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
4c80: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
4c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
4cd0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
4ce0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
4cf0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
4d00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4d10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4d20: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4d30: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4d50: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
4d60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4d70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
4d80: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
4d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4da0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4dc0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4dd0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
4de0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4df0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
4e00: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4e10: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4e20: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4e30: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4e40: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4e50: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4e60: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
4e70: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
4e80: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
4e90: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4eb0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4ec0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
4ed0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
4ee0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
4ef0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
4f00: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
4f10: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
4f20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4f30: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4f40: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4f50: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4f60: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
4f70: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
4f80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4f90: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
4fa0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
4fb0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4fd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4fe0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
4ff0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
5000: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
5010: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
5020: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
5030: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
5040: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5050: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
5060: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5070: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
5080: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
5090: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
50a0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
50b0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
50c0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
50d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
50e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
50f0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
5100: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
5110: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
5120: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
5130: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
5140: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5150: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
5160: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
5170: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5190: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
51a0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
51b0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
51c0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
51d0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
51e0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
51f0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
5200: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
5210: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5230: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
5240: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
5250: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5260: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
5270: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
5280: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
5290: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
52a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
52d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
52e0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
52f0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
5300: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
5310: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
5320: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
5330: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
5340: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
5350: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
5370: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
5380: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
5390: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
53a0: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
53c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65  .#else.  { "Free
53d0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
53e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
53f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5400: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5410: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
5420: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
5430: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
5440: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
5450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5460: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
5470: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
5480: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
5490: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
54a0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
54b0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
54c0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
54d0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
54e0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
54f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5500: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
5510: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5520: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
5530: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
5540: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5550: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
5560: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
5570: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
5580: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
5590: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
55c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
55d0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
55e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
55f0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
5600: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
5610: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
5620: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
5630: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
5650: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5660: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5670: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
5680: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
5690: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
56a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
56b0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
56c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
56d0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
56e0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
56f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5720: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
5730: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
5740: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
5750: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
5760: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
5770: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
5780: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
5790: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
57a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
57b0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
57c0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
57d0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
57e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
57f0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
5800: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
5810: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
5820: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5850: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
5860: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
5870: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5880: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
5890: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
58a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
58b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
58c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
58d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
58e0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
58f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5900: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5910: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
5920: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
5930: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
5940: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5970: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5980: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
5990: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
59a0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
59b0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
59c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
59d0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
59e0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
59f0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
5a10: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5a30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
5a40: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
5a50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5a80: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
5a90: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
5aa0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
5ab0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
5ac0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
5ad0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
5ae0: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
5af0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5b00: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5b10: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
5b20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5b30: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5b50: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5b60: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
5b70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5b90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5ba0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5bb0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
5bc0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
5bd0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
5be0: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e  call[23].pCurren
5bf0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5c00: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
5c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
5c30: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5c40: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5c50: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
5c60: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
5c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5c80: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
5c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5cd0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
5ce0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5cf0: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
5d00: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
5d10: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
5d20: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
5d30: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5d40: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
5d50: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5d60: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5d70: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5d80: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
5d90: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
5da0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
5db0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
5dc0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
5dd0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
5de0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (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 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5e10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5e20: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
5e30: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5e40: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
5e50: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
5e60: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
5e70: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
5e80: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
5e90: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
5ea0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
5eb0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
5ec0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5ed0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
5ee0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5ef0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
5f00: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
5f10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5f20: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5f30: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54  NSION).#if SQLIT
5f40: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
5f50: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
5f60: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
5f70: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
5f80: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
5f90: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
5fa0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
5fb0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
5fc0: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
5fd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5fe0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
5ff0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
6000: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
6010: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
6020: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
6030: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
6040: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
6050: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
6060: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
6070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6080: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
6090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
60a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20  endif.#else.  { 
60b0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
60c0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
60d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
60f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6100: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  e osGetProcAddre
6110: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49  ssA ((FARPROC(WI
6120: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20  NAPI*)(HMODULE, 
6130: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
6140: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
6150: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6160: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6170: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
6180: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
6190: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
61a0: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
61b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
61c0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
61d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
61e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6200: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6210: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
6220: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6230: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  (LPSYSTEM_INFO))
6240: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
6250: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
6260: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
6270: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6280: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  GetSystemTime,  
6290: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
62a0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
62b0: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  emTime ((VOID(WI
62c0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54  NAPI*)(LPSYSTEMT
62d0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39  IME))aSyscall[29
62e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
62f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
6300: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  E.  { "GetSystem
6310: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
6320: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
6330: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
6340: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
6350: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
6360: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
6370: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6390: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
63a0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
63b0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28  imeAsFileTime ((
63c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
63d0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
63e0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30  IME))aSyscall[30
63f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6400: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6410: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
6420: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
6430: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
6440: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
6450: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20  athA,           
6460: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6470: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
6480: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6490: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
64b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
64c0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  e osGetTempPathA
64d0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
64e0: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61  )(DWORD,LPSTR))a
64f0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
6500: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6510: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
6520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6530: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
6540: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
6550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6560: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
6570: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hW,            0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
6590: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
65e0: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28  osGetTempPathW (
65f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6600: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53  DWORD,LPWSTR))aS
6610: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72  yscall[32].pCurr
6620: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6630: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6640: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
6650: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6660: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c  LL)GetTickCount,
6670: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6680: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
6690: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
66a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
66b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
66d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
66e0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
66f0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
6700: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
6710: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6720: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6730: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
6740: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
6750: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22  TVERSIONEX.  { "
6760: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
6770: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6780: 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41  LL)GetVersionExA
6790: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
67a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56  .#else.  { "GetV
67b0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
67d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
67f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
6800: 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42  etVersionExA ((B
6810: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
6820: 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53          LPOSVERS
6830: 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61  IONINFOA))aSysca
6840: 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[34].pCurrent)
6850: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6860: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
6870: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6880: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
6890: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
68a0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
68b0: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
68c0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xW",           (
68d0: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
68e0: 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20 20  onExW,          
68f0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6900: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
6910: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6920: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6940: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6950: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
6960: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
6970: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
6980: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61  SVERSIONINFOW))a
6990: 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72  Syscall[35].pCur
69a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
69b0: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
69c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
69d0: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
69e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
69f0: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
6a00: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
6a10: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6a20: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6a30: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d  _T))aSyscall[36]
6a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6a50: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6a60: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
6a70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6a80: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
6a90: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ab0: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b00: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
6b10: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6b20: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
6b30: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6b40: 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70  ))aSyscall[37].p
6b50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6b70: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
6b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6b90: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
6ba0: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
6bb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6bc0: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
6bd0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6be0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6c00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6c10: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
6c20: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6c30: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
6c40: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  38].pCurrent).. 
6c50: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6c70: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6ca0: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
6cb0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6cc0: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
6cd0: 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72  yscall[39].pCurr
6ce0: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
6cf0: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
6d00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6d10: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
6d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6d30: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
6d40: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
6d50: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6d60: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
6d70: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6d80: 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e  call[40].pCurren
6d90: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
6da0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6dc0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
6dd0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6de0: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
6df0: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
6e00: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6e10: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
6e20: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43  )aSyscall[41].pC
6e30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6e40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6e50: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
6e60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6e70: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
6e80: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
6e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6ea0: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
6eb0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6ef0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
6f00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6f10: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
6f20: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
6f30: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75  aSyscall[42].pCu
6f40: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6f50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
6f60: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6f70: 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63  .  { "HeapCompac
6f80: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
6f90: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d  (SYSCALL)HeapCom
6fa0: 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  pact,           
6fb0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6fc0: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6fe0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7000: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7010: 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63 74  ne osHeapCompact
7020: 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a 29   ((UINT(WINAPI*)
7030: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61  (HANDLE,DWORD))a
7040: 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72  Syscall[43].pCur
7050: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
7060: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
7070: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
7080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7090: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
70a0: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  ).  { "LoadLibra
70b0: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
70c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69   (SYSCALL)LoadLi
70d0: 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20  braryA,         
70e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
70f0: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
7100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7110: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7130: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7140: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  ine osLoadLibrar
7150: 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  yA ((HMODULE(WIN
7160: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
7170: 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72  yscall[44].pCurr
7180: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7190: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
71a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
71b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
71c0: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
71d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
71e0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
71f0: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
7200: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
7210: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
7220: 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryW,            
7230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7240: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
7250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7290: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20   osLoadLibraryW 
72a0: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
72b0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
72c0: 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e  call[45].pCurren
72d0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
72e0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
72f0: 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20  calFree",       
7300: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7310: 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20  )LocalFree,     
7320: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7330: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  else.  { "LocalF
7340: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
7350: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7380: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  f..#define osLoc
7390: 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28  alFree ((HLOCAL(
73a0: 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29  WINAPI*)(HLOCAL)
73b0: 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43  )aSyscall[46].pC
73c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
73d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
73e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
73f0: 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  T.  { "LockFile"
7400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7410: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
7420: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
7430: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7440: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7460: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7480: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
7490: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23  def osLockFile.#
74a0: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
74b0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
74c0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
74d0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
74e0: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
74f0: 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65  scall[47].pCurre
7500: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7510: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7520: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78  .  { "LockFileEx
7530: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7540: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c  (SYSCALL)LockFil
7550: 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  eEx,            
7560: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7570: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
7580: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7590: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
75b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
75c0: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a  ef osLockFileEx.
75d0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
75e0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
75f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7600: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  D,DWORD,DWORD,DW
7610: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7620: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7630: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
7640: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7650: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7660: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
7670: 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20  INRT && \.      
7680: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
7690: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
76a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
76b0: 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d 61  SIZE>0)).  { "Ma
76c0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
76d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
76e0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  )MapViewOfFile, 
76f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7700: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
7710: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
7720: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7750: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
7760: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56  ViewOfFile ((LPV
7770: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
7780: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
7790: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
77a0: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
77b0: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
77c0: 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54  .  { "MultiByteT
77d0: 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20  oWideChar",     
77e0: 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79  (SYSCALL)MultiBy
77f0: 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20  teToWideChar,   
7800: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7810: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7820: 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41  eChar ((int(WINA
7830: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
7840: 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54  LPCSTR,int,LPWST
7850: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74  R, \.        int
7860: 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70  ))aSyscall[50].p
7870: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51  Current)..  { "Q
7880: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
7890: 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c  ounter", (SYSCAL
78a0: 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  L)QueryPerforman
78b0: 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a  ceCounter, 0 },.
78c0: 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79  .#define osQuery
78d0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
78e0: 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  er ((BOOL(WINAPI
78f0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41  *)( \.        LA
7900: 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53  RGE_INTEGER*))aS
7910: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72  yscall[51].pCurr
7920: 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46  ent)..  { "ReadF
7930: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7940: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65       (SYSCALL)Re
7950: 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  adFile,         
7960: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7970: 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20  fine osReadFile 
7980: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7990: 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57  HANDLE,LPVOID,DW
79a0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
79b0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
79c0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32  PED))aSyscall[52
79d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
79e0: 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c   "SetEndOfFile",
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7a00: 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c  CALL)SetEndOfFil
7a10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
7a20: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  },..#define osSe
7a30: 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f  tEndOfFile ((BOO
7a40: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7a50: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e  E))aSyscall[53].
7a60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7a70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7a80: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7a90: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
7aa0: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
7ab0: 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20  ointer,         
7ac0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7ad0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
7ae0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7af0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7b10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7b20: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
7b30: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  er ((DWORD(WINAP
7b40: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c  I*)(HANDLE,LONG,
7b50: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20  PLONG, \.       
7b60: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
7b70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [54].pCurrent)..
7b80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7b90: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22  INRT.  { "Sleep"
7ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7bb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65      (SYSCALL)Sle
7bc0: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
7bd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7be0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7c30: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28  define osSleep (
7c40: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44  (VOID(WINAPI*)(D
7c50: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
7c60: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
7c70: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  { "SystemTimeToF
7c80: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59  ileTime",    (SY
7c90: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65  SCALL)SystemTime
7ca0: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30  ToFileTime,    0
7cb0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
7cc0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7cd0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
7ce0: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d  I*)(CONST SYSTEM
7cf0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
7d00: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
7d10: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
7d20: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7d30: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
7d40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7d50: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7d70: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
7d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
7d90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
7da0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
7db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7dc0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7de0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
7df0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65  osUnlockFile.#de
7e00: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
7e10: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
7e20: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
7e30: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7e40: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
7e50: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65  scall[57].pCurre
7e60: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7e70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7e80: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7e90: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
7ea0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
7eb0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
7ec0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7ed0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7ef0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7f10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7f20: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  ne osUnlockFileE
7f30: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7f40: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
7f50: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7f60: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
7f70: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d  ED))aSyscall[58]
7f80: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7f90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7fa0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
7fb0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
7fc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
7fd0: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d 61  SIZE>0.  { "Unma
7fe0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
7ff0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
8000: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  nmapViewOfFile, 
8010: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8020: 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  se.  { "UnmapVie
8030: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
8040: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8070: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70  .#define osUnmap
8080: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f  ViewOfFile ((BOO
8090: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f  L(WINAPI*)(LPCVO
80a0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d  ID))aSyscall[59]
80b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
80c0: 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  "WideCharToMulti
80d0: 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43  Byte",     (SYSC
80e0: 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75  ALL)WideCharToMu
80f0: 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d  ltiByte,     0 }
8100: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64  ,..#define osWid
8110: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
8120: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
8130: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53  UINT,DWORD,LPCWS
8140: 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74  TR,int,LPSTR,int
8150: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
8160: 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63  TR,LPBOOL))aSysc
8170: 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74  all[60].pCurrent
8180: 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c  )..  { "WriteFil
8190: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
81a0: 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65    (SYSCALL)Write
81b0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
81c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
81d0: 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28  e osWriteFile ((
81e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
81f0: 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  NDLE,LPCVOID,DWO
8200: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
8210: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
8220: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d  ED))aSyscall[61]
8230: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8240: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
8250: 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74    { "CreateEvent
8260: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  ExW",          (
8270: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76  SYSCALL)CreateEv
8280: 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20  entExW,         
8290: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
82a0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
82b0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
82c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
82e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
82f0: 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  e osCreateEventE
8300: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
8310: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
8320: 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53  ATTRIBUTES,LPCWS
8330: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
8340: 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63  ORD,DWORD))aSysc
8350: 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74  all[62].pCurrent
8360: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
8370: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
8380: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8390: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
83a0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
83b0: 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65  ect,     0 },.#e
83c0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
83d0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
83e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8410: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
8420: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20  ForSingleObject 
8430: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
8440: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
8450: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
8460: 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[63].pCurrent)
8470: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
8480: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69 74  _WINCE.  { "Wait
8490: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
84a0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57  x",   (SYSCALL)W
84b0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
84c0: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  ctEx,   0 },.#el
84d0: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
84e0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
84f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8520: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
8530: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
8540: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
8550: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
8560: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29  \.        BOOL))
8570: 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75  aSyscall[64].pCu
8580: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8590: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
85a0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
85b0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
85c0: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
85d0: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d  erEx,        0 }
85e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
85f0: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
8600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8610: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8630: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8640: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
8650: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
8660: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
8670: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
8680: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
8690: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
86a0: 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  65].pCurrent)..#
86b0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
86c0: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  RT.  { "GetFileI
86d0: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
86e0: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
86f0: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
8700: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20  onByHandleEx, 0 
8710: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
8720: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
8730: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
8740: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8750: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8760: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8770: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
8780: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28  ionByHandleEx ((
8790: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
87a0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
87b0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e  FILE_INFO_BY_HAN
87c0: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44  DLE_CLASS,LPVOID
87d0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
87e0: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [66].pCurrent)..
87f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8800: 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65 64  NRT && (!defined
8810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
8820: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
8830: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b  MMAP_SIZE>0).  {
8840: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
8850: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
8860: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
8870: 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20  leFromApp,    0 
8880: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
8890: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
88a0: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
88b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
88c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
88d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
88e0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
88f0: 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57  omApp ((LPVOID(W
8900: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55  INAPI*)(HANDLE,U
8910: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a  LONG,ULONG64, \.
8920: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
8930: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75  aSyscall[67].pCu
8940: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8950: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8960: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
8970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
8980: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c  ALL)CreateFile2,
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
89a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
89b0: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
89c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
89d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
89e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
89f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8a00: 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41  CreateFile2 ((HA
8a10: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
8a20: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
8a30: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
8a40: 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32     LPCREATEFILE2
8a50: 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
8a60: 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36  TERS))aSyscall[6
8a70: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
8a80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8a90: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
8aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
8ab0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
8ac0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
8ad0: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
8ae0: 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  L)LoadPackagedLi
8af0: 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a  brary,     0 },.
8b00: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50  #else.  { "LoadP
8b10: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
8b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8b50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
8b60: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
8b70: 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  y ((HMODULE(WINA
8b80: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a  PI*)(LPCWSTR, \.
8b90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
8ba0: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72  Syscall[69].pCur
8bb0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8bc0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8bd0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
8be0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8bf0: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  LL)GetTickCount6
8c00: 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  4,          0 },
8c10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
8c20: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
8c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
8c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8c50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8c60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
8c70: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28  etTickCount64 ((
8c80: 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49  ULONGLONG(WINAPI
8c90: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8ca0: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[70].pCurrent).
8cb0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8cc0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74  INRT.  { "GetNat
8cd0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
8ce0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8cf0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8d00: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
8d10: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
8d20: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
8d30: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8d60: 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69  define osGetNati
8d70: 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  veSystemInfo ((V
8d80: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
8d90: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
8da0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
8db0: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  71].pCurrent)..#
8dc0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8dd0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
8de0: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8df0: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
8e00: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8e10: 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20  DebugStringA,   
8e20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8e30: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
8e40: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
8e50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8e70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8e80: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8e90: 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28  gStringA ((VOID(
8ea0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
8eb0: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
8ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
8ed0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8ee0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
8ef0: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8f00: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
8f10: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8f20: 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  tringW,      0 }
8f30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
8f40: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
8f50: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8f60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8f70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8f80: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8f90: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8fa0: 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gW ((VOID(WINAPI
8fb0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
8fc0: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e  call[73].pCurren
8fd0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  t)..  { "GetProc
8fe0: 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20  essHeap",       
8ff0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
9000: 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20  rocessHeap,     
9010: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
9020: 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48  ne osGetProcessH
9030: 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  eap ((HANDLE(WIN
9040: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
9050: 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e  call[74].pCurren
9060: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
9070: 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64 65 66  S_WINRT && (!def
9080: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9090: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
90a0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
90b0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
90c0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c  MappingFromApp",
90d0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
90e0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
90f0: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  pp, 0 },.#else. 
9100: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
9110: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
9120: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
9150: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
9160: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20  eMappingFromApp 
9170: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
9180: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
9190: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
91a0: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c  TTRIBUTES,ULONG,
91b0: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29  ULONG64,LPCWSTR)
91c0: 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43  )aSyscall[75].pC
91d0: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e  urrent)../*.** N
91e0: 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62  OTE: On some sub
91f0: 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65 20  -platforms, the 
9200: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
9210: 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e 63  reExchange "func
9220: 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69  tion".**       i
9230: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
9240: 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73 20  macro that uses 
9250: 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69  a compiler intri
9260: 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29 2e  nsic (e.g. x64).
9270: 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f 20  .**       So do 
9280: 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65 20  not try to make 
9290: 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20 72  this is into a r
92a0: 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65 72  edefinable inter
92b0: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  face..*/.#if def
92c0: 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64  ined(Interlocked
92d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29  CompareExchange)
92e0: 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65  .  { "Interlocke
92f0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9300: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
9330: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
9340: 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e 74  pareExchange Int
9350: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
9360: 78 63 68 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20  xchange.#else.  
9370: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  { "InterlockedCo
9380: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20  mpareExchange", 
9390: 28 53 59 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f  (SYSCALL)Interlo
93a0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
93b0: 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  nge, 0 },..#defi
93c0: 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64  ne osInterlocked
93d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20  CompareExchange 
93e0: 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  ((LONG(WINAPI*)(
93f0: 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20 20 20 53  LONG \.        S
9400: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
9410: 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47  TILE*, LONG,LONG
9420: 29 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70  ))aSyscall[76].p
9430: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 20  Current).#endif 
9440: 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72  /* defined(Inter
9450: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
9460: 68 61 6e 67 65 29 20 2a 2f 0a 0a 23 69 66 20 21  hange) */..#if !
9470: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
9480: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
9490: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
94a0: 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b  N32_USE_UUID.  {
94b0: 20 22 55 75 69 64 43 72 65 61 74 65 22 2c 20 20   "UuidCreate",  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
94d0: 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65  SCALL)UuidCreate
94e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
94f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75  },.#else.  { "Uu
9500: 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  idCreate",      
9510: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
9520: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
9530: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
9540: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
9550: 73 55 75 69 64 43 72 65 61 74 65 20 28 28 52 50  sUuidCreate ((RP
9560: 43 5f 53 54 41 54 55 53 28 52 50 43 5f 45 4e 54  C_STATUS(RPC_ENT
9570: 52 59 2a 29 28 55 55 49 44 2a 29 29 61 53 79 73  RY*)(UUID*))aSys
9580: 63 61 6c 6c 5b 37 37 5d 2e 70 43 75 72 72 65 6e  call[77].pCurren
9590: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
95a0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
95b0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
95c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
95d0: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43  _UUID.  { "UuidC
95e0: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 22  reateSequential"
95f0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55  ,     (SYSCALL)U
9600: 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74  uidCreateSequent
9610: 69 61 6c 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ial,   0 },.#els
9620: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  e.  { "UuidCreat
9630: 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20  eSequential",   
9640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
9670: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72  #define osUuidCr
9680: 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 20 5c  eateSequential \
9690: 0a 20 20 20 20 20 20 20 20 28 28 52 50 43 5f 53  .        ((RPC_S
96a0: 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a  TATUS(RPC_ENTRY*
96b0: 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c  )(UUID*))aSyscal
96c0: 6c 5b 37 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[78].pCurrent).
96d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
96e0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 26 26  LITE_NO_SYNC) &&
96f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
9700: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 46 6c 75  _SIZE>0.  { "Flu
9710: 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  shViewOfFile",  
9720: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
9730: 29 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65  )FlushViewOfFile
9740: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
9750: 6c 73 65 0a 20 20 7b 20 22 46 6c 75 73 68 56 69  lse.  { "FlushVi
9760: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
9770: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
97a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
97b0: 68 56 69 65 77 4f 66 46 69 6c 65 20 5c 0a 20 20  hViewOfFile \.  
97c0: 20 20 20 20 20 20 28 28 42 4f 4f 4c 28 57 49 4e        ((BOOL(WIN
97d0: 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 2c 53 49  API*)(LPCVOID,SI
97e0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 37  ZE_T))aSyscall[7
97f0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  9].pCurrent)..};
9800: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
9810: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
9820: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
9830: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
9840: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
9850: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
9860: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
9870: 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20   the.** "win32" 
9880: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
9890: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
98a0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
98b0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
98c0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
98d0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
98e0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
98f0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
9900: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
9910: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
9920: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53  atic int winSetS
9930: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
9940: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
9950: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
9960: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
9970: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
9980: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
99a0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
99b0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
99c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
99d0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
99e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
99f0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
9a00: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
9a10: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
9a20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9a30: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
9a40: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9a50: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
9a60: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
9a70: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
9a80: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
9a90: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
9aa0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
9ab0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
9ac0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
9ad0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
9ae0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9af0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
9b00: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
9b10: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
9b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9b30: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
9b40: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
9b50: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
9b60: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
9b70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
9b80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9b90: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
9ba0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
9bb0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
9bc0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
9bd0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
9be0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
9bf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9c00: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
9c10: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
9c20: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
9c30: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
9c40: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
9c50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9c60: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
9c70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
9c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
9c90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
9ca0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
9cb0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
9cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
9cd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9ce0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
9cf0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
9d00: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
9d10: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
9d20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
9d30: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
9d40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9d70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9d80: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
9d90: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
9da0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
9db0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
9dc0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
9dd0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
9de0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
9df0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
9e00: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
9e10: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
9e20: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
9e30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e  _syscall_ptr win
9e40: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
9e50: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
9e60: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
9e70: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
9e80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
9e90: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
9ea0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
9eb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9ec0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
9ed0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
9ee0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
9ef0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
9f00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
9f10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
9f20: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9f30: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
9f40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
9f50: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
9f60: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
9f70: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
9f80: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
9f90: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
9fa0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
9fb0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
9fc0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
9fd0: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
9fe0: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
9ff0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
a000: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
a010: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
a020: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
a030: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
a040: 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d  r *winNextSystem
a050: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
a060: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
a070: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
a080: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
a090: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
a0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
a0b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
a0c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
a0d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
a0e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
a0f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
a100: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
a110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
a120: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
a130: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
a140: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
a150: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
a160: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
a170: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
a180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
a190: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a1a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
a1b0: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
a1c0: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
a1d0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
a1e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
a1f0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
a200: 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f  compact it.  Upo
a210: 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
a220: 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74  E_OK will be ret
a230: 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69  urned.  Upon fai
a240: 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20  lure, one.** of 
a250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51  SQLITE_NOMEM, SQ
a260: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53  LITE_ERROR, or S
a270: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77  QLITE_NOTFOUND w
a280: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
a290: 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67    The.** "pnLarg
a2a0: 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69  est" argument, i
a2b0: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c  f non-zero, will
a2c0: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75   be used to retu
a2d0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
a2e0: 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f  he.** largest co
a2f0: 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f  mmitted free blo
a300: 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20  ck in the heap, 
a310: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74  in bytes..*/.int
a320: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63   sqlite3_win32_c
a330: 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49  ompact_heap(LPUI
a340: 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20  NT pnLargest){. 
a350: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a360: 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72  _OK;.  UINT nLar
a370: 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44  gest = 0;.  HAND
a380: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
a390: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
a3a0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
a3b0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
a3c0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
a3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
a3e0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
a3f0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
a400: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
a410: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
a420: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
a430: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
a440: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
a450: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
a460: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
a470: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
a480: 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
a490: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
a4a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
a4b0: 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65  ( (nLargest=osHe
a4c0: 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c  apCompact(hHeap,
a4d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
a4e0: 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b  AP_FLAGS))==0 ){
a4f0: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
a500: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
a510: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28  Error();.    if(
a520: 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45   lastErrno==NO_E
a530: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71  RROR ){.      sq
a540: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a550: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
a560: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
a570: 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d  no space), heap=
a580: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
a590: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
a5a0: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eap);.      rc =
a5b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
a5c0: 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
a5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
a5e0: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22  (SQLITE_ERROR, "
a5f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
a600: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61  mpact (%lu), hea
a610: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
a620: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
a630: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
a640: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  *)hHeap);.      
a650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
a660: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
a670: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  se.  sqlite3_log
a680: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  (SQLITE_NOTFOUND
a690: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
a6a0: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25  pCompact, heap=%
a6b0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
a6c0: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
a6d0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
a6e0: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a  OTFOUND;.#endif.
a6f0: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20    if( pnLargest 
a700: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e  ) *pnLargest = n
a710: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72  Largest;.  retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
a730: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
a740: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
a750: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
a760: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
a770: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74  tempt to.** dest
a780: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
a790: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e   it.  If the Win
a7a0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69  32 native heap i
a7b0: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61  s not isolated a
a7c0: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c  nd/or.** the sql
a7d0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a7e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  () function does
a7f0: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f   not return zero
a800: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69  , SQLITE_BUSY wi
a810: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65  ll.** be returne
a820: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73  d and no changes
a830: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
a840: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   the Win32 nativ
a850: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73  e heap..*/.int s
a860: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73  qlite3_win32_res
a870: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74  et_heap(){.  int
a880: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47   rc;.  MUTEX_LOG
a890: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
a8a0: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a  x *pMaster; ) /*
a8b0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
a8c0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a8d0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
a8e0: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20  _mutex *pMem; ) 
a8f0: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73     /* The memsys
a900: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
a910: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a920: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a930: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a940: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a950: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54  MASTER); ).  MUT
a960: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d  EX_LOGIC( pMem =
a970: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
a980: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a990: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20  STATIC_MEM); ). 
a9a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a9b0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
a9c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a9d0: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69  nter(pMem);.  wi
a9e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a9f0: 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47  );.  if( winMemG
aa00: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26  etHeap()!=NULL &
aa10: 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  & winMemGetOwned
aa20: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65  () && sqlite3_me
aa30: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
aa40: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
aa50: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
aa60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
aa70: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65  o outstanding me
aa80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
aa90: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68   on.    ** the h
aaa0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63  eap.  Also, sinc
aab0: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65  e both the maste
aac0: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63  r and memsys loc
aad0: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ks are currently
aae0: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65  .    ** being he
aaf0: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68  ld by us, no oth
ab00: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  er function (i.e
ab10: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  . from another t
ab20: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20  hread) should.  
ab30: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20    ** be able to 
ab40: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20  even access the 
ab50: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74  heap.  Attempt t
ab60: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  o destroy and re
ab70: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a  create our.    *
ab80: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32  * isolated Win32
ab90: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77   native heap now
aba0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
abb0: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
abc0: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
abd0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
abe0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
abf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ac00: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
ac10: 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d  =0 );.    winMem
ac20: 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47  Shutdown(winMemG
ac30: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
ac40: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
ac50: 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20  GetHeap()==NULL 
ac60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
ac70: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
ac80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ac90: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
aca0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
acb0: 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28  rc = winMemInit(
acc0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
acd0: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
ace0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
acf0: 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  | winMemGetHeap(
ad00: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
ad10: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
ad20: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
ad30: 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20  tOwned() );.    
ad40: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ad50: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
ad60: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
ad70: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
ad80: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
ad90: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
ada0: 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  p cannot be modi
adb0: 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20  fied because it 
adc0: 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20  may be in use.. 
add0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
ade0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
adf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ae00: 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73  leave(pMem);.  s
ae10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ae20: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
ae30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ae40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
ae50: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
ae60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ae70: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70  n outputs the sp
ae80: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73  ecified (ANSI) s
ae90: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e  tring to the Win
aea0: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28  32 debugger.** (
aeb0: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
aec0: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  /..void sqlite3_
aed0: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
aee0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  g(const char *zB
aef0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
af00: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51   char zDbgBuf[SQ
af10: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
af20: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  UF_SIZE];.  int 
af30: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c  nMin = MIN(nBuf,
af40: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44   (SQLITE_WIN32_D
af50: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29  BG_BUF_SIZE - 1)
af60: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67  ); /* may be neg
af70: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20  ative. */.  if( 
af80: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d  nMin<-1 ) nMin =
af90: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61   -1; /* all nega
afa0: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f  tive values beco
afb0: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65  me -1. */.  asse
afc0: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20  rt( nMin==-1 || 
afd0: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c  nMin==0 || nMin<
afe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
aff0: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66  _BUF_SIZE );.#if
b000: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b010: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
b020: 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 28  ( !zBuf ){.    (
b030: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
b040: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
b050: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
b060: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
b070: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
b080: 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  I).  if( nMin>0 
b090: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
b0a0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
b0b0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
b0c0: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
b0d0: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
b0e0: 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74  nMin);.    osOut
b0f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
b100: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
b110: 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  e{.    osOutputD
b120: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66  ebugStringA(zBuf
b130: 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66  );.  }.#elif def
b140: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b150: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65  2_HAS_WIDE).  me
b160: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
b170: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
b180: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69  G_BUF_SIZE);.  i
b190: 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  f ( osMultiByteT
b1a0: 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 20  oWideChar(.     
b1b0: 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70       osAreFileAp
b1c0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
b1d0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c  P : CP_OEMCP, 0,
b1e0: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
b1f0: 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a   nMin, (LPWSTR)z
b200: 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57  DbgBuf, SQLITE_W
b210: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
b220: 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29  E/sizeof(WCHAR))
b230: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
b240: 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75  n;.  }.  osOutpu
b250: 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c  tDebugStringW((L
b260: 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b  PCWSTR)zDbgBuf);
b270: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69  .#else.  if( nMi
b280: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
b290: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
b2a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
b2b0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
b2c0: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
b2d0: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66  uf, nMin);.    f
b2e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
b2f0: 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20  %s", zDbgBuf);. 
b300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
b310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
b320: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
b330: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
b340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
b350: 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 20  ne suspends the 
b360: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 66  current thread f
b370: 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a  or at least ms.*
b380: 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20  * milliseconds. 
b390: 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
b3a0: 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ent to the Win32
b3b0: 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61   Sleep() interfa
b3c0: 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ce..*/.#if SQLIT
b3d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69  E_OS_WINRT.stati
b3e0: 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62  c HANDLE sleepOb
b3f0: 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  j = NULL;.#endif
b400: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
b410: 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44  in32_sleep(DWORD
b420: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a   milliseconds){.
b430: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
b440: 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70  NRT.  if ( sleep
b450: 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj==NULL ){.   
b460: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72   sleepObj = osCr
b470: 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c  eateEventExW(NUL
b480: 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f  L, NULL, CREATE_
b490: 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53  EVENT_MANUAL_RES
b4a0: 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ET,.            
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29      SYNCHRONIZE)
b4d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b4e0: 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
b4f0: 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ;.  osWaitForSin
b500: 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65  gleObjectEx(slee
b510: 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e  pObj, millisecon
b520: 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73  ds, FALSE);.#els
b530: 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c  e.  osSleep(mill
b540: 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69  iseconds);.#endi
b550: 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
b560: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
b570: 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45 5f  DS>0 && !SQLITE_
b580: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
b590: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
b5a0: 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  \.        SQLITE
b5b0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 44 57  _THREADSAFE>0.DW
b5c0: 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e 33 32  ORD sqlite3Win32
b5d0: 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f 62 6a  Wait(HANDLE hObj
b5e0: 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20 72 63  ect){.  DWORD rc
b5f0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d  ;.  while( (rc =
b600: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
b610: 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65 63 74  ObjectEx(hObject
b620: 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20 20 20  , INFINITE,.    
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 54 52 55 45 29 29 3d 3d 57 41 49 54 5f     TRUE))==WAIT_
b660: 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b  IO_COMPLETION ){
b670: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b680: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b690: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
b6a0: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
b6b0: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
b6c0: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
b6d0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
b6e0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
b6f0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
b700: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
b710: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
b720: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
b730: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
b740: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
b750: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
b760: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b770: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
b780: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
b790: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
b7a0: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
b7b0: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
b7c0: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
b7d0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
b7e0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
b7f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
b800: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
b810: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
b820: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
b830: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
b840: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
b850: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
b860: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
b870: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
b880: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23  eEx() API..*/..#
b890: 69 66 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32  if !SQLITE_WIN32
b8a0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
b8b0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b8c0: 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54   (1).#elif SQLIT
b8d0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
b8e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c  LITE_OS_WINRT ||
b8f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b900: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
b910: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
b920: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
b930: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b940: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
b950: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b960: 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66   (0).#else.# def
b970: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28  ine osIsNT()  ((
b980: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
b990: 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77  =2) || sqlite3_w
b9a0: 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65  in32_is_nt()).#e
b9b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
b9c0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
b9d0: 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63 68  ines if the mach
b9e0: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ine is running a
b9f0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64   version of Wind
ba00: 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ows.** based on 
ba10: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a  the NT kernel..*
ba20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
ba30: 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b  n32_is_nt(void){
ba40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
ba50: 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INRT.  /*.  ** N
ba60: 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20 73  OTE: The WinRT s
ba70: 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20 61  ub-platform is a
ba80: 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f  lways assumed to
ba90: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
baa0: 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b   NT.  **       k
bab0: 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  ernel..  */.  re
bac0: 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 53 51  turn 1;.#elif SQ
bad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
bae0: 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73  RSIONEX.  if( os
baf0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bb00: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bb10: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20  te3_os_type, 0, 
bb20: 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  0)==0 ){.#if def
bb30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bb40: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
bb50: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
bb60: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
bb70: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
bb80: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
bb90: 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65  fo);.    osGetVe
bba0: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29  rsionExA(&sInfo)
bbb0: 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63  ;.    osInterloc
bbc0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
bbd0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
bbe0: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49  ype,.        (sI
bbf0: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
bc00: 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d   == VER_PLATFORM
bc10: 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a  _WIN32_NT) ? 2 :
bc20: 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64 65   1, 0);.#elif de
bc30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
bc40: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
bc50: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20   OSVERSIONINFOW 
bc60: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
bc70: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
bc80: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
bc90: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
bca0: 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f  ersionExW(&sInfo
bcb0: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
bcc0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
bcd0: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
bce0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
bcf0: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
bd00: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
bd10: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
bd20: 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  : 1, 0);.#endif.
bd30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49    }.  return osI
bd40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
bd50: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
bd60: 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32  e3_os_type, 2, 2
bd70: 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49  )==2;.#elif SQLI
bd80: 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e  TE_TEST.  return
bd90: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
bda0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
bdb0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
bdc0: 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a  2, 2)==2;.#else.
bdd0: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
bde0: 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  All sub-platform
bdf0: 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74 56  s where the GetV
be00: 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e  ersionEx[AW] fun
be10: 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20  ctions are.  ** 
be20: 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65 64        deprecated
be30: 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73 75   are always assu
be40: 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20  med to be based 
be50: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
be60: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
be70: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  1;.#endif.}..#if
be80: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
be90: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c  _MALLOC./*.** Al
bea0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
beb0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
bec0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
bed0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
bee0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
bef0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
bf00: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
bf10: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
bf20: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
bf30: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bf40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bf50: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
bf60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
bf70: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
bf80: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
bf90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
bfa0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
bfb0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
bfc0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
bfd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
bfe0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
bff0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
c000: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
c010: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
c020: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c030: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c040: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
c050: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
c060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c070: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
c080: 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20  ed to HeapAlloc 
c090: 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20  %u bytes (%lu), 
c0a0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
c0b0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
c0c0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c0d0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
c0e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c0f0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
c100: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
c110: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
c120: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
c130: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
c140: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
c150: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
c160: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
c170: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
c180: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
c190: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
c1a0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
c1b0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
c1c0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
c1d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
c1e0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
c1f0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
c200: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
c210: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c220: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
c230: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  r) );.#endif.  i
c240: 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74  f( !pPrior ) ret
c250: 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20  urn; /* Passing 
c260: 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65  NULL to HeapFree
c270: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a   is undefined. *
c280: 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46  /.  if( !osHeapF
c290: 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ree(hHeap, SQLIT
c2a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c2b0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20  GS, pPrior) ){. 
c2c0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c2d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
c2e0: 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65  iled to HeapFree
c2f0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
c300: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c310: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
c320: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
c330: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
c340: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
c350: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
c360: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
c370: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
c380: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
c390: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
c3a0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
c3b0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
c3c0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
c3d0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
c3e0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
c3f0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
c400: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
c410: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
c420: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
c430: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
c440: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
c450: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
c460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
c470: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
c480: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
c490: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
c4a0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c4b0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
c4c0: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
c4d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c4e0: 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  s>=0 );.  if( !p
c4f0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d  Prior ){.    p =
c500: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
c510: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c520: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
c530: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
c540: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f  }else{.    p = o
c550: 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65  sHeapReAlloc(hHe
c560: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c570: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
c580: 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  ior, (SIZE_T)nBy
c590: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tes);.  }.  if( 
c5a0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
c5b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c5c0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25  EM, "failed to %
c5d0: 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29  s %u bytes (%lu)
c5e0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
c600: 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f  or ? "HeapReAllo
c610: 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22  c" : "HeapAlloc"
c620: 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c  , nBytes, osGetL
c630: 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
c640: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
c650: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
c660: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
c670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
c680: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
c690: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
c6a0: 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  , in bytes..*/.s
c6b0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
c6c0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
c6d0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
c6e0: 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69   SIZE_T n;..  wi
c6f0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
c700: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
c710: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
c720: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
c730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
c740: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
c750: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
c760: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
c770: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
c780: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
c790: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
c7a0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
c7b0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
c7c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c7d0: 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69 66  GS, p) );.#endif
c7e0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
c7f0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
c800: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
c810: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c820: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
c830: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
c840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c850: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
c860: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
c870: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ize block %p (%l
c880: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
c8a0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c8b0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
c8c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c8d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
c8e0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
c8f0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
c900: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
c910: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
c920: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
c930: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
c940: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
c950: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
c960: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
c970: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
c980: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
c990: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
c9a0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
c9b0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
c9c0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
c9d0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
c9e0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
c9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ca00: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
ca10: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31  nMemData->magic1
ca20: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
ca30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
ca40: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32  nMemData->magic2
ca50: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
ca60: 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  );..#if !SQLITE_
ca70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
ca80: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
ca90: 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e  EATE.  if( !pWin
caa0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
cab0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49 6e  {.    DWORD dwIn
cac0: 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49  itialSize = SQLI
cad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
cae0: 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f  IT_SIZE;.    DWO
caf0: 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  RD dwMaximumSize
cb00: 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74 65   = (DWORD)sqlite
cb10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
cb20: 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77 4d  eap;.    if( dwM
cb30: 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b  aximumSize==0 ){
cb40: 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d  .      dwMaximum
cb50: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49  Size = SQLITE_WI
cb60: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
cb70: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
cb80: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64   dwInitialSize>d
cb90: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a  wMaximumSize ){.
cba0: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53        dwInitialS
cbb0: 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53  ize = dwMaximumS
cbc0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ize;.    }.    p
cbd0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cbe0: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65  p = osHeapCreate
cbf0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45  (SQLITE_WIN32_HE
cc00: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_FLAGS,.      
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64  dwInitialSize, d
cc40: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20  wMaximumSize);. 
cc50: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44     if( !pWinMemD
cc60: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
cc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
cc80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
cc90: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
cca0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25  to HeapCreate (%
ccb0: 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69  lu), flags=%u, i
ccc0: 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78  nitSize=%lu, max
ccd0: 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20  Size=%lu",.     
cce0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
ccf0: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
cd00: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
cd10: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20  dwInitialSize,. 
cd20: 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69 6d           dwMaxim
cd30: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  umSize);.      r
cd40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cd50: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
cd60: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
cd70: 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20  bOwned = TRUE;. 
cd80: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
cd90: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
cda0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57  ;.  }.#else.  pW
cdb0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cdc0: 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48   = osGetProcessH
cdd0: 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57  eap();.  if( !pW
cde0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cdf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ce00: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
ce10: 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65  ,.        "faile
ce20: 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48  d to GetProcessH
ce30: 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65  eap (%lu)", osGe
ce40: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  tLastError());. 
ce50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ce60: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
ce70: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
ce80: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
ce90: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
cea0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
ceb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
cec0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
ced0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
cee0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
cef0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
cf00: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
cf10: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
cf20: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
cf30: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
cf40: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
cf50: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
cf60: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
cf70: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
cf80: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
cf90: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
cfa0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
cfb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cfc0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
cfd0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
cfe0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
cff0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
d000: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
d010: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
d020: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
d030: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
d040: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
d050: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
d060: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d070: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e  ata->magic1==WIN
d080: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20  MEM_MAGIC1 );.  
d090: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d0a0: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e  ata->magic2==WIN
d0b0: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20  MEM_MAGIC2 );.. 
d0c0: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
d0d0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
d0e0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
d0f0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
d100: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
d110: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
d120: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
d130: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
d140: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
d150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
d160: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
d170: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
d180: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
d190: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
d1a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
d1b0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
d1c0: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
d1d0: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
d1e0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
d1f0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
d200: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
d210: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
d220: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
d230: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
d240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d250: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
d260: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
d270: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
d280: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
d290: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
d2a0: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
d2b0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
d2c0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
d2d0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
d2e0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
d2f0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
d300: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
d310: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
d320: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
d330: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
d340: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
d350: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
d360: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
d370: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
d380: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
d390: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
d3a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d3b0: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
d3c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
d3d0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
d3e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
d3f0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
d400: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
d410: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
d420: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
d430: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
d440: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
d450: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
d460: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
d470: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
d480: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
d490: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
d4a0: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
d4b0: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
d4c0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
d4d0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
d4e0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
d4f0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
d500: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
d510: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
d520: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
d530: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
d540: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
d550: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
d560: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
d570: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
d580: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
d590: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d5a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
d5b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
d5c0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
d5d0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
d5e0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  de..**.** Space 
d5f0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
d600: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d610: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d620: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d630: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
d640: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
d650: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
d660: 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  xt){.  int nChar
d670: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
d680: 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  Text;..  nChar =
d690: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
d6a0: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
d6b0: 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55  0, zText, -1, NU
d6c0: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
d6d0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
d6e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
d6f0: 69 64 65 54 65 78 74 20 3d 20 73 71 6c 69 74 65  ideText = sqlite
d700: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
d710: 61 72 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ar*sizeof(WCHAR)
d720: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 54   );.  if( zWideT
d730: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
d750: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
d760: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
d770: 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d  TF8, 0, zText, -
d780: 31 2c 20 7a 57 69 64 65 54 65 78 74 2c 0a 20 20  1, zWideText,.  
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
d7b0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
d7c0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
d7d0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 54 65  te3_free(zWideTe
d7e0: 78 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54 65  xt);.    zWideTe
d7f0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  xt = 0;.  }.  re
d800: 74 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b 0a  turn zWideText;.
d810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
d820: 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69   a Microsoft Uni
d830: 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 55  code string to U
d840: 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  TF-8..**.** Spac
d850: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d860: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d870: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d880: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d890: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
d8a0: 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66  *winUnicodeToUtf
d8b0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54  8(LPCWSTR zWideT
d8c0: 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ext){.  int nByt
d8d0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74  e;.  char *zText
d8e0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
d8f0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
d900: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
d910: 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c  WideText, -1, 0,
d920: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
d930: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
d940: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d950: 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69 74  .  zText = sqlit
d960: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
d970: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54 65  yte );.  if( zTe
d980: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  xt==0 ){.    ret
d990: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
d9a0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
d9b0: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
d9c0: 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74  F8, 0, zWideText
d9d0: 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79  , -1, zText, nBy
d9e0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
da10: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
da20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
da30: 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78  zText);.    zTex
da40: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
da50: 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a  urn zText;.}../*
da60: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
da70: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
da80: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
da90: 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49 20   using the ANSI 
daa0: 6f 72 20 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20 70  or OEM.** code p
dab0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
dac0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
dad0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
dae0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
daf0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
db00: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
db10: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
db20: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
db30: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69  ext, int useAnsi
db40: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
db50: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 54 65    LPWSTR zMbcsTe
db60: 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  xt;.  int codepa
db70: 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20 43  ge = useAnsi ? C
db80: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
db90: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
dba0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
dbb0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
dbc0: 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  zText, -1, NULL,
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52   0)*sizeof(WCHAR
dc00: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
dc10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dc20: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 54 65  0;.  }.  zMbcsTe
dc30: 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  xt = sqlite3Mall
dc40: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
dc50: 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20  zeof(WCHAR) );. 
dc60: 20 69 66 28 20 7a 4d 62 63 73 54 65 78 74 3d 3d   if( zMbcsText==
dc70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dc80: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
dc90: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
dca0: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
dcb0: 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a   0, zText, -1, z
dcc0: 4d 62 63 73 54 65 78 74 2c 0a 20 20 20 20 20 20  MbcsText,.      
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
dcf0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
dd00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dd10: 66 72 65 65 28 7a 4d 62 63 73 54 65 78 74 29 3b  free(zMbcsText);
dd20: 0a 20 20 20 20 7a 4d 62 63 73 54 65 78 74 20 3d  .    zMbcsText =
dd30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
dd40: 20 7a 4d 62 63 73 54 65 78 74 3b 0a 7d 0a 0a 2f   zMbcsText;.}../
dd50: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d  *.** Convert a M
dd60: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
dd70: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c   string to a mul
dd80: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
dd90: 72 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 75 73 69  r string,.** usi
dda0: 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20 4f  ng the ANSI or O
ddb0: 45 4d 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a  EM code page..**
ddc0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
ddd0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
dde0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
ddf0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
de00: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
de10: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
de20: 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54  odeToMbcs(LPCWST
de30: 52 20 7a 57 69 64 65 54 65 78 74 2c 20 69 6e 74  R zWideText, int
de40: 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74   useAnsi){.  int
de50: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
de60: 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64  zText;.  int cod
de70: 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73 69 20  epage = useAnsi 
de80: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
de90: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
dea0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
deb0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
dec0: 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31  0, zWideText, -1
ded0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
dee0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
def0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
df00: 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73  .  }.  zText = s
df10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
df20: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
df30: 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
df40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
df50: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
df60: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
df70: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
df80: 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78 74  eText, -1, zText
df90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a    nByte, 0, 0);.
dfc0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
dfd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dfe0: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20  free(zText);.   
dff0: 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a   zText = 0;.  }.
e000: 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b 0a    return zText;.
e010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
e020: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68   a multi-byte ch
e030: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
e040: 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53  o UTF-8..**.** S
e050: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
e060: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
e070: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
e080: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
e090: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
e0a0: 61 72 20 2a 77 69 6e 4d 62 63 73 54 6f 55 74 66  ar *winMbcsToUtf
e0b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  8(const char *zT
e0c0: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69  ext, int useAnsi
e0d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74  ){.  char *zText
e0e0: 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Utf8;.  LPWSTR z
e0f0: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
e100: 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f  Wide = winMbcsTo
e110: 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c 20 75  Unicode(zText, u
e120: 73 65 41 6e 73 69 29 3b 0a 20 20 69 66 28 20 7a  seAnsi);.  if( z
e130: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
e140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e150: 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77 69    zTextUtf8 = wi
e160: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
e170: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
e180: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
e190: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65  e);.  return zTe
e1a0: 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xtUtf8;.}../*.**
e1b0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
e1c0: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c   string to a mul
e1d0: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
e1e0: 72 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  r string..**.** 
e1f0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
e200: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
e210: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
e220: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
e230: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
e240: 68 61 72 20 2a 77 69 6e 55 74 66 38 54 6f 4d 62  har *winUtf8ToMb
e250: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
e260: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
e270: 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  i){.  char *zTex
e280: 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  tMbcs;.  LPWSTR 
e290: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
e2a0: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54  pWide = winUtf8T
e2b0: 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b  oUnicode(zText);
e2c0: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
e2d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
e2e0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 4d   0;.  }.  zTextM
e2f0: 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  bcs = winUnicode
e300: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 2c  ToMbcs(zTmpWide,
e310: 20 75 73 65 41 6e 73 69 29 3b 0a 20 20 73 71 6c   useAnsi);.  sql
e320: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
e330: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  de);.  return zT
e340: 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  extMbcs;.}../*.*
e350: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
e360: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
e370: 68 65 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  he winUtf8ToUnic
e380: 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ode() function..
e390: 2a 2f 0a 4c 50 57 53 54 52 20 73 71 6c 69 74 65  */.LPWSTR sqlite
e3a0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
e3b0: 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  unicode(const ch
e3c0: 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64  ar *zText){.#ifd
e3d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e3e0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e3f0: 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28   !zText ){.    (
e400: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e410: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e420: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
e430: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e440: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
e450: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
e460: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
e470: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
e480: 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 55  eturn winUtf8ToU
e490: 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a 7d  nicode(zText);.}
e4a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e4b0: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72  a public wrapper
e4c0: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 6e 69 63   for the winUnic
e4d0: 6f 64 65 54 6f 55 74 66 38 28 29 20 66 75 6e 63  odeToUtf8() func
e4e0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e4f0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69  qlite3_win32_uni
e500: 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c 50 43  code_to_utf8(LPC
e510: 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b  WSTR zWideText){
e520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e530: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e540: 20 20 69 66 28 20 21 7a 57 69 64 65 54 65 78 74    if( !zWideText
e550: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e560: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e580: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e5a0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e5b0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e5c0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e5d0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e5e0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
e5f0: 7a 57 69 64 65 54 65 78 74 29 3b 0a 7d 0a 0a 2f  zWideText);.}../
e600: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
e610: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
e620: 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f 55  r the winMbcsToU
e630: 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  tf8() function..
e640: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
e650: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
e660: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tf8(const char *
e670: 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53  zText){.#ifdef S
e680: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e690: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54  _ARMOR.  if( !zT
e6a0: 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ext ){.    (void
e6b0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e6c0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
e6d0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
e6e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e6f0: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
e700: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
e710: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
e720: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
e730: 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28  n winMbcsToUtf8(
e740: 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c 65  zText, osAreFile
e750: 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a  ApisANSI());.}..
e760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
e770: 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66  public wrapper f
e780: 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f  or the winMbcsTo
e790: 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e  Utf8() function.
e7a0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
e7b0: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
e7c0: 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63 68  utf8_v2(const ch
e7d0: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
e7e0: 73 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66 20  seAnsi){.#ifdef 
e7f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e800: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
e810: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
e820: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e830: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e840: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
e850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e860: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
e870: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
e880: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
e890: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
e8a0: 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  rn winMbcsToUtf8
e8b0: 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29  (zText, useAnsi)
e8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e8d0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
e8e0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55  per for the winU
e8f0: 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e 63  tf8ToMbcs() func
e900: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e910: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
e920: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
e930: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69  char *zText){.#i
e940: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e950: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e960: 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20  f( !zText ){.   
e970: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
e980: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
e990: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
e9a0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e9b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
e9c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
e9d0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
e9e0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
e9f0: 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54   return winUtf8T
ea00: 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 6f 73 41  oMbcs(zText, osA
ea10: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
ea20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ea30: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
ea40: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
ea50: 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e  Utf8ToMbcs() fun
ea60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
ea70: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
ea80: 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f  f8_to_mbcs_v2(co
ea90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
eaa0: 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 23   int useAnsi){.#
eab0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
eac0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
ead0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
eae0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
eaf0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
eb00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
eb10: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
eb20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
eb30: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
eb40: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
eb50: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
eb60: 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38    return winUtf8
eb70: 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 75 73  ToMbcs(zText, us
eb80: 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eAnsi);.}../*.**
eb90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
eba0: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72  ets the data dir
ebb0: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65  ectory or the te
ebc0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
ebd0: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  y based on.** th
ebe0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d  e provided argum
ebf0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20  ents.  The type 
ec00: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
ec10: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   1 in order to s
ec20: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64  et the.** data d
ec30: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e  irectory or 2 in
ec40: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
ec50: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
ec60: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c  ctory.  The zVal
ec70: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  ue.** argument i
ec80: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
ec90: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75  e directory to u
eca0: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  se.  The return 
ecb0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  value will be.**
ecc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
ecd0: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
ece0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
ecf0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f  et_directory(DWO
ed00: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52  RD type, LPCWSTR
ed10: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72   zValue){.  char
ed20: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d   **ppDirectory =
ed30: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
ed40: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
ed50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
ed60: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
ed70: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
ed80: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
ed90: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
eda0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
edb0: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
edc0: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
edd0: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   &sqlite3_data_d
ede0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73  irectory;.  }els
edf0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49  e if( type==SQLI
ee00: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
ee10: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
ee20: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
ee30: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  = &sqlite3_temp_
ee40: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20  directory;.  }. 
ee50: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
ee60: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53  ctory || type==S
ee70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
ee80: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
ee90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70            || typ
eea0: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
eeb0: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
eec0: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  YPE.  );.  asser
eed0: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
eee0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
eef0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72  ugHasType(*ppDir
ef00: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f  ectory, MEMTYPE_
ef10: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70  HEAP) );.  if( p
ef20: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  pDirectory ){.  
ef30: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74    char *zValueUt
ef40: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  f8 = 0;.    if( 
ef50: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65  zValue && zValue
ef60: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61  [0] ){.      zVa
ef70: 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69  lueUtf8 = winUni
ef80: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75  codeToUtf8(zValu
ef90: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a  e);.      if ( z
efa0: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a  ValueUtf8==0 ){.
efb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
efc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
efd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
efe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
eff0: 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a  (*ppDirectory);.
f000: 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79      *ppDirectory
f010: 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20   = zValueUtf8;. 
f020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f030: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
f040: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
f050: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74  }../*.** The ret
f060: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e  urn value of win
f070: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  GetLastErrorMsg.
f080: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
f090: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
f0a0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
f0b0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
f0c0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
f0d0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
f0e0: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
f0f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
f100: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57  tLastErrorMsg(DW
f110: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69  ORD lastErrno, i
f120: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
f130: 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61  Buf){.  /* Forma
f140: 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73  tMessage returns
f150: 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20   0 on failure.  
f160: 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a  Otherwise it.  *
f170: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  * returns the nu
f180: 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77  mber of TCHARs w
f190: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
f1a0: 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  tput.  ** buffer
f1b0: 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
f1c0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c  terminating null
f1d0: 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57   char..  */.  DW
f1e0: 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20  ORD dwLen = 0;. 
f1f0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b   char *zOut = 0;
f200: 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
f210: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
f220: 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41  S_WINRT.    WCHA
f230: 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49  R zTempWide[SQLI
f240: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
f250: 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20  MSG_CHARS+1];.  
f260: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
f270: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
f280: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
f290: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
f2c0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
f2d0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
f360: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
f390: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
f3a0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50  0);.#else.    LP
f3d0: 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d  WSTR zTempWide =
f3e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
f3f0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
f400: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
f410: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
f420: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
f450: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
f480: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
f490: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
f4e0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65     (LPWSTR) &zTe
f530: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a       0);.#endif.
f580: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
f590: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
f5a0: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
f5b0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
f5c0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
f5d0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
f5e0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
f5f0: 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  Out = winUnicode
f600: 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65  ToUtf8(zTempWide
f610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f620: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
f630: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
f640: 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a  S_WINRT.      /*
f650: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
f660: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
f670: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
f680: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
f690: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64  calFree(zTempWid
f6a0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
f6b0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
f6c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
f6d0: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
f6e0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
f6f0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
f700: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
f710: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
f720: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
f750: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
f760: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
f790: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
f7a0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
f7f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
f830: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
f880: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
f890: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
f8a0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
f8b0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
f8c0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
f8d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
f8e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
f8f0: 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74  ut = winMbcsToUt
f900: 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46  f8(zTemp, osAreF
f910: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
f920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
f930: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
f940: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
f950: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
f960: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
f970: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
f980: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
f990: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
f9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
f9b0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
f9c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f9d0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
f9e0: 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c  sError 0x%lx (%l
f9f0: 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  u)", lastErrno, 
fa00: 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65  lastErrno);.  }e
fa10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
fa20: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
fa30: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
fa40: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
fa50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fa60: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
fa70: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
fa80: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
fa90: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
faa0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
fab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
fac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68  ;.}../*.**.** Th
fad0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69  is function - wi
fae0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
faf0: 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ) - is only ever
fb00: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
fb10: 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45  macro.** winLogE
fb20: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rror()..**.** Th
fb30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
fb40: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
fb50: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
fb60: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  n OS function..*
fb70: 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  * It logs a mess
fb80: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
fb90: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
fba0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
fbb0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  alue of.** error
fbc0: 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f   code and, if po
fbd0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
fbe0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
fbf0: 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f  alent from.** Fo
fc00: 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a  rmatMessage..**.
fc10: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
fc20: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
fc30: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
fc40: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
fc50: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
fc60: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
fc70: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
fc80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
fc90: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
fca0: 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  )..** The two su
fcb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
fcc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
fcd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
fce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
fcf0: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
fd00: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
fd10: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
fd20: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
fd30: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
fd40: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
fd50: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
fd60: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
fd70: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
fd80: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
fd90: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
fda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
fdb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
fdc0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
fdd0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
fde0: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
fdf0: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
fe00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
fe30: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
fe40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fe50: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
fe60: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
fe70: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
fe80: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
fe90: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
feb0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
fec0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
fed0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
fee0: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
ff10: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
ff20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ff50: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
ff60: 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61   = 0;.  winGetLa
ff70: 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45  stErrorMsg(lastE
ff80: 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73  rrno, sizeof(zMs
ff90: 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73  g), zMsg);.  ass
ffa0: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
ffb0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
ffc0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
ffd0: 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d  h = "";.  for(i=
ffe0: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d  0; zMsg[i] && zM
fff0: 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a  sg[i]!='\r' && z
10000 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b  Msg[i]!='\n'; i+
10010 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d  +){}.  zMsg[i] =
10020 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   0;.  sqlite3_lo
10030 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
10040 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28   "os_win.c:%d: (
10050 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73  %lu) %s(%s) - %s
10060 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
10070 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
10080 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
10090 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
100a0 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
100b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
100c0 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
100d0 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
100e0 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
100f0 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
10100 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
10110 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
10120 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
10130 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72  ed by.** antivir
10140 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c  us software.  Al
10150 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64  so the initial d
10160 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20  elay before the 
10170 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20  first retry..** 
10180 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61  The delay increa
10190 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74  ses linearly wit
101a0 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f  h each retry..*/
101b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
101c0 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
101d0 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
101e0 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
101f0 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69  TRY 10.#endif.#i
10200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
10210 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
10220 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ELAY.# define SQ
10230 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
10240 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a  _RETRY_DELAY 25.
10250 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e  #endif.static in
10260 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20  t winIoerrRetry 
10270 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
10280 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
10290 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
102a0 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49  etryDelay = SQLI
102b0 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
102c0 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a  ETRY_DELAY;../*.
102d0 2a 2a 20 54 68 65 20 22 77 69 6e 49 73 4c 6f 63  ** The "winIsLoc
102e0 6b 69 6e 67 45 72 72 6f 72 22 20 6d 61 63 72 6f  kingError" macro
102f0 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
10300 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74 69  rmine if a parti
10310 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72  cular I/O.** err
10320 6f 72 20 63 6f 64 65 20 69 73 20 64 75 65 20 74  or code is due t
10330 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 20  o file locking. 
10340 20 49 74 20 6d 75 73 74 20 61 63 63 65 70 74 20   It must accept 
10350 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 44  the error code D
10360 57 4f 52 44 0a 2a 2a 20 61 73 20 69 74 73 20 6f  WORD.** as its o
10370 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  nly argument and
10380 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e   should return n
10390 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
103a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 64 75 65  rror code is due
103b0 0a 2a 2a 20 74 6f 20 66 69 6c 65 20 6c 6f 63 6b  .** to file lock
103c0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ing..*/.#if !def
103d0 69 6e 65 64 28 77 69 6e 49 73 4c 6f 63 6b 69 6e  ined(winIsLockin
103e0 67 45 72 72 6f 72 29 0a 23 64 65 66 69 6e 65 20  gError).#define 
103f0 77 69 6e 49 73 4c 6f 63 6b 69 6e 67 45 72 72 6f  winIsLockingErro
10400 72 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f  r(a) (((a)==ERRO
10410 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e  R_LOCK_VIOLATION
10420 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20  )       || \.   
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
10450 3d 45 52 52 4f 52 5f 49 4f 5f 50 45 4e 44 49 4e  =ERROR_IO_PENDIN
10460 47 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  G)).#endif../*.*
10470 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43  * The "winIoerrC
10480 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f 20  anRetry1" macro 
10490 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
104a0 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74 69 63  mine if a partic
104b0 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f  ular I/O.** erro
104c0 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65 64 20  r code obtained 
104d0 76 69 61 20 47 65 74 4c 61 73 74 45 72 72 6f 72  via GetLastError
104e0 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65 20 74  () is eligible t
104f0 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 49  o be retried.  I
10500 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65 70 74  t.** must accept
10510 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
10520 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f 6e 6c  DWORD as its onl
10530 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  y argument and s
10540 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20  hould return.** 
10550 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
10560 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 74 72  error code is tr
10570 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74 75 72  ansient in natur
10580 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61 74  e and the operat
10590 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  ion.** responsib
105a0 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  le for generatin
105b0 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  g the original e
105c0 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63 63 65  rror might succe
105d0 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a  ed upon being.**
105e0 20 72 65 74 72 69 65 64 2e 20 20 54 68 65 20 61   retried.  The a
105f0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
10600 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
10610 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a  a variable..**.*
10620 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
10630 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22 77  a macro named "w
10640 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
10650 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e 65 64  " may be defined
10660 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 64  .  If it.** is d
10670 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c 20  efined, it will 
10680 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c  be consulted onl
10690 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63 72 6f  y when the macro
106a0 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
106b0 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ry1".** returns 
106c0 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69 6e 49  zero.  The "winI
106d0 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d  oerrCanRetry2" m
106e0 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74 65  acro is complete
106f0 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 0a  ly optional and.
10700 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ** may be used t
10710 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69 74 69  o include additi
10720 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64 65 73  onal error codes
10730 20 69 6e 20 74 68 65 20 73 65 74 20 74 68 61 74   in the set that
10740 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75 6c   should.** resul
10750 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69 6e 67  t in the failing
10760 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 62   I/O operation b
10770 65 69 6e 67 20 72 65 74 72 69 65 64 20 62 79 20  eing retried by 
10780 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49 66 0a  the caller.  If.
10790 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  ** defined, the 
107a0 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
107b0 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74 20 65  y2" macro must e
107c0 78 68 69 62 69 74 20 65 78 74 65 72 6e 61 6c 20  xhibit external 
107d0 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64 65  semantics.** ide
107e0 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73 65 20  ntical to those 
107f0 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72  of the "winIoerr
10800 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f  CanRetry1" macro
10810 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
10820 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  d(winIoerrCanRet
10830 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77 69 6e  ry1).#define win
10840 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 61  IoerrCanRetry1(a
10850 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f 41  ) (((a)==ERROR_A
10860 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20 20 20  CCESS_DENIED)   
10870 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
108a0 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  ROR_SHARING_VIOL
108b0 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a 20  ATION)    || \. 
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
108e0 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49  )==ERROR_LOCK_VI
108f0 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20 20 7c  OLATION)       |
10900 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44 45    ((a)==ERROR_DE
10930 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20 20 20  V_NOT_EXIST)    
10940 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10960 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
10970 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45 54  OR_NETNAME_DELET
10980 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  ED)      || \.  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
109b0 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d 45  ==ERROR_SEM_TIME
109c0 4f 55 54 29 20 20 20 20 20 20 20 20 20 20 7c 7c  OUT)          ||
109d0 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
10a00 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c 45  WORK_UNREACHABLE
10a10 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
10a20 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29   If a ReadFile()
10a30 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20   or WriteFile() 
10a40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e  error occurs, in
10a50 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
10a60 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69  e.** to see if i
10a70 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72  t should be retr
10a80 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ied.  Return TRU
10a90 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74  E to retry.  Ret
10aa0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20  urn FALSE.** to 
10ab0 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20  give up with an 
10ac0 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
10ad0 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49 6f 65   int winRetryIoe
10ae0 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c  rr(int *pnRetry,
10af0 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b   DWORD *pError){
10b00 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47  .  DWORD e = osG
10b10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
10b20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77   if( *pnRetry>=w
10b30 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a  inIoerrRetry ){.
10b40 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
10b50 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
10b60 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = e;.    }.    r
10b70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
10b80 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  f( winIoerrCanRe
10b90 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20 20 73  try1(e) ){.    s
10ba0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
10bb0 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
10bc0 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
10bd0 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
10be0 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
10bf0 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  1;.  }.#if defin
10c00 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  ed(winIoerrCanRe
10c10 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69 66 28  try2).  else if(
10c20 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72   winIoerrCanRetr
10c30 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  y2(e) ){.    sql
10c40 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
10c50 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65  (winIoerrRetryDe
10c60 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
10c70 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
10c80 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
10c90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
10ca0 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
10cb0 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d  *pError = e;.  }
10cc0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
10cd0 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20  /*.** Log a I/O 
10ce0 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73  error retry epis
10cf0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
10d00 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  oid winLogIoerr(
10d10 69 6e 74 20 6e 52 65 74 72 79 2c 20 69 6e 74 20  int nRetry, int 
10d20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6e  lineno){.  if( n
10d30 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  Retry ){.    sql
10d40 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
10d50 4e 4f 54 49 43 45 2c 0a 20 20 20 20 20 20 22 64  NOTICE,.      "d
10d60 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20  elayed %dms for 
10d70 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e  lock/sharing con
10d80 66 6c 69 63 74 20 61 74 20 6c 69 6e 65 20 25 64  flict at line %d
10d90 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72  ",.      winIoer
10da0 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74  rRetryDelay*nRet
10db0 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 2c  ry*(nRetry+1)/2,
10dc0 20 6c 69 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a 20   lineno.    );. 
10dd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
10de0 20 23 69 66 20 64 6f 65 73 20 6e 6f 74 20 72 65   #if does not re
10df0 6c 79 20 6f 6e 20 74 68 65 20 53 51 4c 49 54 45  ly on the SQLITE
10e00 5f 4f 53 5f 57 49 4e 43 45 20 64 65 66 69 6e 65  _OS_WINCE define
10e10 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
10e20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 65  corresponding se
10e30 63 74 69 6f 6e 20 69 6e 20 22 64 61 74 65 2e 63  ction in "date.c
10e40 22 20 63 61 6e 6e 6f 74 20 75 73 65 20 69 74 2e  " cannot use it.
10e50 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
10e60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43  (SQLITE_OMIT_LOC
10e70 41 4c 54 49 4d 45 29 20 26 26 20 64 65 66 69 6e  ALTIME) && defin
10e80 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 20 26  ed(_WIN32_WCE) &
10e90 26 20 5c 0a 20 20 20 20 28 21 64 65 66 69 6e 65  & \.    (!define
10ea0 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f  d(SQLITE_MSVC_LO
10eb0 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20  CALTIME_API) || 
10ec0 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43  !SQLITE_MSVC_LOC
10ed0 41 4c 54 49 4d 45 5f 41 50 49 29 0a 2f 2a 0a 2a  ALTIME_API)./*.*
10ee0 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f  * The MSVC CRT o
10ef0 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79  n Windows CE may
10f00 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61   not have a loca
10f10 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  ltime() function
10f20 2e 0a 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 61  ..** So define a
10f30 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a   substitute..*/.
10f40 23 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  #  include <time
10f50 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
10f60 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
10f70 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
10f80 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
10f90 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
10fa0 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
10fb0 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
10fc0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
10fd0 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
10fe0 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
10ff0 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
11000 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
11010 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
11020 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
11030 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
11040 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
11050 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
11060 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
11070 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
11080 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
11090 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
110a0 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
110b0 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
110c0 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
110d0 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
110e0 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
110f0 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
11100 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
11110 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
11120 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
11130 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
11140 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
11150 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
11160 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
11170 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23    return &y;.}.#
11180 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
11190 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a  E_OS_WINCE./****
111a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
111e0 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65  *****.** This se
111f0 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63  ction contains c
11200 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e  ode for WinCE on
11210 6c 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 48  ly..*/.#define H
11220 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
11230 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28  (a) (winFile*)&(
11240 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29  (char*)a)[-(int)
11250 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65  offsetof(winFile
11260 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ,h)]../*.** Acqu
11270 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ire a lock on th
11280 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74  e handle h.*/.st
11290 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d  atic void winceM
112a0 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44  utexAcquire(HAND
112b0 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20  LE h){.   DWORD 
112c0 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20  dwErr;.   do {. 
112d0 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61      dwErr = osWa
112e0 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
112f0 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  t(h, INFINITE);.
11300 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72     } while (dwEr
11310 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54  r != WAIT_OBJECT
11320 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57  _0 && dwErr != W
11330 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a  AIT_ABANDONED);.
11340 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  }./*.** Release 
11350 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20  a lock acquired 
11360 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  by winceMutexAcq
11370 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e  uire().*/.#defin
11380 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65  e winceMutexRele
11390 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75  ase(h) ReleaseMu
113a0 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72  tex(h)../*.** Cr
113b0 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  eate the mutex a
113c0 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  nd shared memory
113d0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
113e0 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  g in the file.**
113f0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11400 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
11410 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
11420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
11430 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a  ename, winFile *
11440 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52  pFile){.  LPWSTR
11450 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20   zTok;.  LPWSTR 
11460 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c  zName;.  DWORD l
11470 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c  astErrno;.  BOOL
11480 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45   bLogged = FALSE
11490 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d  ;.  BOOL bInit =
114a0 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20   TRUE;..  zName 
114b0 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  = winUtf8ToUnico
114c0 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
114d0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
114e0 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d  .    /* out of m
114f0 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74  emory */.    ret
11500 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11510 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
11520 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
11530 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
11540 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  data */.  memset
11550 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20  (&pFile->local, 
11560 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d  0, sizeof(pFile-
11570 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20  >local));..  /* 
11580 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b  Replace the back
11590 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65  slashes from the
115a0 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f   filename and lo
115b0 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20  wercase it.  ** 
115c0 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74 65  to derive a mute
115d0 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f  x name. */.  zTo
115e0 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72 57  k = osCharLowerW
115f0 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28  (zName);.  for (
11600 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a  ;*zTok;zTok++){.
11610 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d      if (*zTok ==
11620 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27   '\\') *zTok = '
11630 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72  _';.  }..  /* Cr
11640 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61  eate/open the na
11650 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70  med mutex */.  p
11660 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f  File->hMutex = o
11670 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55  sCreateMutexW(NU
11680 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65  LL, FALSE, zName
11690 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  );.  if (!pFile-
116a0 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 46  >hMutex){.    pF
116b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
116c0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
116d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
116e0 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
116f0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
11700 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
11710 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11720 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11730 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
11740 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46  CreateLock1", zF
11750 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  ilename);.  }.. 
11760 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
11770 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e  mutex before con
11780 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e  tinuing */.  win
11790 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
117a0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
117b0 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e    /* Since the n
117c0 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75  ames of named mu
117d0 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65  texes, semaphore
117e0 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73  s, file mappings
117f0 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20 63 61   etc are.  ** ca
11800 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61  se-sensitive, ta
11810 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
11820 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73  that by uppercas
11830 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61  ing the mutex na
11840 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e  me.  ** and usin
11850 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68  g that as the sh
11860 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67  ared filemapping
11870 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73   name..  */.  os
11880 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65  CharUpperW(zName
11890 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61  );.  pFile->hSha
118a0 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69  red = osCreateFi
118b0 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
118c0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
118d0 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
11900 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
11910 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
11920 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
11950 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 61  me);..  /* Set a
11960 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
11970 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66  ates we're the f
11980 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74  irst to create t
11990 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 0a  he memory so it.
119a0 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72    ** must be zer
119b0 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  o-initialized */
119c0 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  .  lastErrno = o
119d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
119e0 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e 6f  .  if (lastErrno
119f0 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44   == ERROR_ALREAD
11a00 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62  Y_EXISTS){.    b
11a10 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20  Init = FALSE;.  
11a20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
11a30 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  e(zName);..  /* 
11a40 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  If we succeeded 
11a50 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68  in making the sh
11a60 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
11a70 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20  le, map it. */. 
11a80 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61   if( pFile->hSha
11a90 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  red ){.    pFile
11aa0 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63  ->shared = (winc
11ab0 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77  eLock*)osMapView
11ac0 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53  OfFile(pFile->hS
11ad0 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hared,.         
11ae0 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41      FILE_MAP_REA
11af0 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  D|FILE_MAP_WRITE
11b00 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  , 0, 0, sizeof(w
11b10 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  inceLock));.    
11b20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61  /* If mapping fa
11b30 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20  iled, close the 
11b40 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
11b50 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69  ndle and erase i
11b60 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46  t */.    if( !pF
11b70 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20  ile->shared ){. 
11b80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11b90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11ba0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
11bb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
11bc0 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
11bd0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
11bf0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22  inceCreateLock2"
11c00 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
11c10 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
11c20 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73  UE;.      osClos
11c30 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
11c40 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
11c50 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
11c60 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NULL;.    }.  }.
11c70 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20  .  /* If shared 
11c80 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74  memory could not
11c90 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65   be created, the
11ca0 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  n close the mute
11cb0 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20  x and fail */.  
11cc0 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  if( pFile->hShar
11cd0 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ed==NULL ){.    
11ce0 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a  if( !bLogged ){.
11cf0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
11d00 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
11d10 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  no;.      winLog
11d20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
11d30 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
11d40 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11d50 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
11d60 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c  eateLock3", zFil
11d70 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c  ename);.      bL
11d80 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  ogged = TRUE;.  
11d90 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74    }.    winceMut
11da0 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
11db0 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
11dc0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
11dd0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
11de0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
11df0 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e  NULL;.    return
11e00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
11e10 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
11e20 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d  ize the shared m
11e30 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73  emory if we're s
11e40 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20  upposed to */.  
11e50 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20  if( bInit ){.   
11e60 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73   memset(pFile->s
11e70 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  hared, 0, sizeof
11e80 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
11e90 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
11ea0 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
11eb0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11ed0 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
11ee0 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
11ef0 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
11f00 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
11f10 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
11f20 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
11f30 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
11f40 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
11f50 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
11f60 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
11f70 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
11f80 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
11f90 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
11fa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
11fb0 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
11fc0 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
11fd0 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
11fe0 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
11ff0 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
12000 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
12010 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
12020 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
12030 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
12040 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
12050 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
12060 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
12070 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
12080 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
12090 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
120a0 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
120b0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
120c0 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
120d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
120e0 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
120f0 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
12100 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
12110 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
12120 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12130 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
12140 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
12150 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
12160 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
12170 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
12180 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
12190 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61  le */.    osUnma
121a0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
121b0 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20  e->shared);.    
121c0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
121d0 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
121e0 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
121f0 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
12200 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
12210 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
12220 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
12230 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
12240 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
12250 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
12260 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20    }.}../*.** An 
12270 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
12280 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29  f the LockFile()
12290 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
122a0 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
122b0 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
122c0 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
122d0 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
122e0 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
122f0 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
12300 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
12310 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
12320 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
12330 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
12340 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
12350 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12360 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
12370 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
12380 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
12390 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
123a0 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
123b0 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
123c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
123d0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
123e0 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
123f0 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
12400 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
12410 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
12420 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
12430 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
12440 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
12450 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
12460 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
12470 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
12480 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
12490 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
124a0 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
124b0 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
124c0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
124d0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
124e0 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
124f0 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
12500 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
12510 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
12520 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
12530 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
12540 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
12550 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
12560 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12570 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
12580 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
12590 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
125a0 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
125b0 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
125c0 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
125d0 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
125e0 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
125f0 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
12600 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
12610 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
12620 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
12630 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
12640 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
12650 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
12660 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
12670 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
12680 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
12690 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
126a0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
126b0 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
126c0 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
126d0 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
126e0 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
126f0 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
12700 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  TE.           &&
12710 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
12720 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
12730 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e      /* If no pen
12740 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
12750 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68 65  en acquired, the
12760 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a  n acquire it */.
12770 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
12780 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
12790 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
127a0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
127b0 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
127c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
127d0 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  .bPending = TRUE
127e0 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
127f0 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
12800 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
12810 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f  eserved lock? */
12820 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
12830 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
12840 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
12850 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
12860 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
12870 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
12880 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
12890 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
128a0 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
128b0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
128c0 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
128d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
128e0 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
128f0 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
12900 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
12910 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
12920 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
12930 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
12940 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
12950 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
12960 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
12970 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
12980 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
12990 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
129a0 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a  inceUnlockFile(.
129b0 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
129c0 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
129d0 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
129e0 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
129f0 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
12a00 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
12a10 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
12a20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
12a30 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
12a40 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12a50 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
12a60 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
12a70 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
12a80 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
12a90 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
12aa0 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
12ab0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
12ac0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
12ad0 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
12ae0 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
12af0 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
12b00 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
12b10 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
12b20 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
12b30 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
12b40 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
12b50 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
12b60 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
12b70 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
12b80 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
12b90 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
12ba0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
12bb0 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
12bc0 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
12bd0 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
12be0 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
12bf0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
12c00 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
12c10 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
12c20 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
12c30 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
12c40 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
12c50 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
12c60 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
12c70 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
12c80 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
12c90 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
12ca0 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
12cb0 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
12cc0 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
12cd0 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
12ce0 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
12cf0 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
12d00 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20  SHARED_SIZE.    
12d10 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d           || nNum
12d20 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
12d30 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20  ckLow == 1);.   
12d40 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
12d50 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
12d60 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
12d70 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
12d80 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  0).      {.     
12d90 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
12da0 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
12db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
12dc0 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
12dd0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
12de0 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67  easing a pending
12df0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
12e00 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
12e10 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
12e20 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20  NDING_BYTE.     
12e30 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
12e40 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
12e50 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
12e60 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
12e70 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
12e80 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
12e90 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
12ea0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12eb0 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
12ec0 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
12ed0 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
12ee0 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
12ef0 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
12f00 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
12f10 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12f20 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
12f30 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
12f40 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
12f50 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
12f60 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
12f70 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
12f80 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20  Reserved) {.    
12f90 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
12fa0 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
12fb0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
12fc0 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
12fd0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
12fe0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
12ff0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
13000 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
13010 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
13020 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
13030 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
13040 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
13050 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
13060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130a0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
130b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
130c0 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  NCE */../*.** Lo
130d0 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
130e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
130f0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20   winLockFile(.  
13100 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
13110 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a  .  DWORD flags,.
13120 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f    DWORD offsetLo
13130 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  w,.  DWORD offse
13140 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
13150 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57  umBytesLow,.  DW
13160 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ORD numBytesHigh
13170 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
13180 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  S_WINCE.  /*.  *
13190 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
131a0 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
131b0 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
131c0 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
131d0 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20  he Win32.  **   
131e0 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
131f0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
13200 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
13210 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
13220 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
13250 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
13260 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73  #else.  if( osIs
13270 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
13280 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
13290 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
132a0 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
132b0 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
132c0 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
132d0 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
132e0 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
132f0 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
13300 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70   osLockFileEx(*p
13310 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c  hFile, flags, 0,
13320 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
13330 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
13340 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
13350 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
13360 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
13370 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
13380 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
133b0 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
133c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
133d0 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20  a file region.. 
133e0 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
133f0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  inUnlockFile(.  
13400 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
13410 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
13420 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
13430 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
13440 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
13450 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
13460 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
13470 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
13480 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
13490 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
134a0 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
134b0 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
134c0 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
134d0 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46       API UnlockF
134e0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ile..  */.  retu
134f0 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  rn winceUnlockFi
13500 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
13510 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
13520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13530 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
13540 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
13550 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
13560 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
13570 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
13580 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
13590 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
135a0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
135b0 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
135c0 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
135d0 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
135e0 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
135f0 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
13600 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
13610 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
13620 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
13630 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
13640 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
13650 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
13660 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
13670 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
13680 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
13690 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
136a0 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
136b0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  endif.}../******
136c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
136f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13700 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
13710 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
13720 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
13730 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
13740 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
13750 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
13760 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
13770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
137c0 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
137d0 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
137e0 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
137f0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
13800 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
13810 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
13820 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
13830 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
13840 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
13850 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
13860 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
13870 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
13880 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
13890 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
138a0 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66  t to offset iOff
138b0 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66  set within the f
138c0 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
138d0 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ul, return 0..**
138e0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
138f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13900 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
13910 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
13920 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  int winSeekFile(
13930 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
13940 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
13950 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c  ffset){.#if !SQL
13960 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c  ITE_OS_WINRT.  L
13970 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20  ONG upperBits;  
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13990 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62  * Most sig. 32 b
139a0 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
139b0 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  t */.  LONG lowe
139c0 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
139d0 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20         /* Least 
139e0 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
139f0 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
13a00 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20  DWORD dwRet;    
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
13a30 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
13a40 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44  ter() */.  DWORD
13a50 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
13a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
13a70 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
13a80 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
13a90 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  /..  OSTRACE(("S
13aa0 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66  EEK file=%p, off
13ab0 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69  set=%lld\n", pFi
13ac0 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 29  le->h, iOffset))
13ad0 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d  ;..  upperBits =
13ae0 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74   (LONG)((iOffset
13af0 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
13b00 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73  ff);.  lowerBits
13b10 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65   = (LONG)(iOffse
13b20 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
13b30 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74  ..  /* API oddit
13b40 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  y: If successful
13b50 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  , SetFilePointer
13b60 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f  () returns a dwo
13b70 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  rd.  ** containi
13b80 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d  ng the lower 32-
13b90 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20  bits of the new 
13ba0 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c  file-offset. Or,
13bb0 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20   if it fails,.  
13bc0 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e  ** it returns IN
13bd0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
13be0 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20  OINTER. However 
13bf0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44  according to MSD
13c00 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f  N,.  ** INVALID_
13c10 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
13c20 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20 76   may also be a v
13c30 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74 2e  alid new offset.
13c40 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e 65   So to determine
13c50 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e  .  ** whether an
13c60 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75 61   error has actua
13c70 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69 74  lly occurred, it
13c80 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61   is also necessa
13c90 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20  ry to call.  ** 
13ca0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a  GetLastError()..
13cb0 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f    */.  dwRet = o
13cc0 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28  sSetFilePointer(
13cd0 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42  pFile->h, lowerB
13ce0 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c  its, &upperBits,
13cf0 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20   FILE_BEGIN);.. 
13d00 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56   if( (dwRet==INV
13d10 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
13d20 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28  INTER.      && (
13d30 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
13d40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
13d50 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20  NO_ERROR)) ){.  
13d60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13d70 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
13d80 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
13d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
13da0 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
13db0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
13dc0 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c       "winSeekFil
13dd0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
13de0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
13df0 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
13e00 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  c=SQLITE_IOERR_S
13e10 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  EEK\n", pFile->h
13e20 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
13e30 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
13e40 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
13e50 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
13e60 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13e70 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
13e80 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61    /*.  ** Same a
13e90 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
13ea0 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d  that this implem
13eb0 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66  entation works f
13ec0 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a  or WinRT..  */..
13ed0 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
13ee0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
13ef0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66    /* The new off
13f00 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  set */.  BOOL bR
13f10 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
13f20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
13f30 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
13f40 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29  tFilePointerEx()
13f50 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72   */..  x.QuadPar
13f60 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62  t = iOffset;.  b
13f70 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
13f80 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e  ointerEx(pFile->
13f90 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45  h, x, 0, FILE_BE
13fa0 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65  GIN);..  if(!bRe
13fb0 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  t){.    pFile->l
13fc0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
13fd0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
13fe0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
13ff0 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
14000 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14020 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c    "winSeekFile",
14030 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
14040 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45      OSTRACE(("SE
14050 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
14060 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
14070 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14080 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
14090 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
140a0 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
140b0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
140c0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
140d0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
140e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
140f0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46  MMAP_SIZE>0./* F
14100 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
14110 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20  s to VFS helper 
14120 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72  methods used for
14130 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66   memory mapped f
14140 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  iles */.static i
14150 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69  nt winMapfile(wi
14160 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f  nFile*, sqlite3_
14170 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63 20 69  int64);.static i
14180 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  nt winUnmapfile(
14190 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69  winFile*);.#endi
141a0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  f../*.** Close a
141b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20   file..**.** It 
141c0 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 74  is reported that
141d0 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63   an attempt to c
141e0 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69  lose a handle mi
141f0 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a  ght sometimes.**
14200 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20   fail.  This is 
14210 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61  a very unreasona
14220 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ble result, but 
14230 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72  Windows is notor
14240 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e  ious.** for bein
14250 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73  g unreasonable s
14260 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74  o I do not doubt
14270 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 68   that it might h
14280 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68  appen.  If.** th
14290 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77  e close fails, w
142a0 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 20  e pause for 100 
142b0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
142c0 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a   try again.  As.
142d0 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c  ** many as MX_CL
142e0 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65  OSE_ATTEMPT atte
142f0 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68  mpts to close th
14300 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64  e handle are mad
14310 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69  e before.** givi
14320 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ng up and return
14330 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
14340 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53  .#define MX_CLOS
14350 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74  E_ATTEMPT 3.stat
14360 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28  ic int winClose(
14370 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14380 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74  ){.  int rc, cnt
14390 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20   = 0;.  winFile 
143a0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
143b0 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
143c0 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64  ( id!=0 );.#ifnd
143d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
143e0 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  AL.  assert( pFi
143f0 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23  le->pShm==0 );.#
14400 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
14410 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26  pFile->h!=NULL &
14420 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41  & pFile->h!=INVA
14430 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
14440 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
14450 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70  CLOSE pid=%lu, p
14460 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14470 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14480 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
14490 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
144a0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66  pFile->h));..#if
144b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
144c0 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d  _SIZE>0.  winUnm
144d0 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23  apfile(pFile);.#
144e0 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20  endif..  do{.   
144f0 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e   rc = osCloseHan
14500 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
14510 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f     /* SimulateIO
14520 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74  Error( rc=0; cnt
14530 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50  =MX_CLOSE_ATTEMP
14540 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c  T; ); */.  }whil
14550 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
14560 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
14570 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33  EMPT && (sqlite3
14580 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
14590 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c  ), 1) );.#if SQL
145a0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65  ITE_OS_WINCE.#de
145b0 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54  fine WINCE_DELET
145c0 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20  ION_ATTEMPTS 3. 
145d0 20 7b 0a 20 20 20 20 77 69 6e 56 66 73 41 70 70   {.    winVfsApp
145e0 44 61 74 61 20 2a 70 41 70 70 44 61 74 61 20 3d  Data *pAppData =
145f0 20 28 77 69 6e 56 66 73 41 70 70 44 61 74 61 2a   (winVfsAppData*
14600 29 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 70 41  )pFile->pVfs->pA
14610 70 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  ppData;.    if( 
14620 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c 20 7c  pAppData==NULL |
14630 7c 20 21 70 41 70 70 44 61 74 61 2d 3e 62 4e 6f  | !pAppData->bNo
14640 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 77 69  Lock ){.      wi
14650 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70  nceDestroyLock(p
14660 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
14670 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
14680 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
14690 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
146a0 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
146b0 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
146c0 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
146d0 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
146e0 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
146f0 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
14700 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
14710 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
14720 66 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74  f.        && cnt
14730 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54  ++ < WINCE_DELET
14740 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20  ION_ATTEMPTS.   
14750 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
14760 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
14770 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
14780 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
14790 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
147a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
147b0 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  free(pFile->zDel
147c0 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d  eteOnClose);.  }
147d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
147e0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68   ){.    pFile->h
147f0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f   = NULL;.  }.  O
14800 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
14810 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
14820 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
14830 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14840 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
14850 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
14860 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
14870 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20  e, pFile->h, rc 
14880 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
14890 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
148a0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20   ? SQLITE_OK.   
148b0 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f           : winLo
148c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
148d0 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74  ERR_CLOSE, osGet
148e0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65         "winClose
14910 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
14930 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
14940 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
14950 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
14960 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
14970 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
14980 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
14990 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
149a0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
149b0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
149c0 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
149d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
149e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
149f0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
14a00 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a20 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
14a30 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
14a40 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
14a70 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
14a80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
14a90 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
14aa0 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
14ab0 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
14ac0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
14ad0 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
14ae0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
14af0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
14b00 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
14b10 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
14b20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
14b30 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
14b40 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
14b50 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
14b60 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
14b70 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
14b80 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
14b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14ba0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
14bb0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
14bc0 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
14bd0 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
14be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14bf0 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
14c00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
14c10 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
14c20 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
14c30 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
14c40 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14c50 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
14c60 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
14c70 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
14c80 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
14c90 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  , file=%p, buffe
14ca0 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
14cb0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f   ".           "o
14cc0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b  ffset=%lld, lock
14cd0 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  =%d\n", osGetCur
14ce0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
14cf0 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
14d00 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75     pFile->h, pBu
14d10 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20  f, amt, offset, 
14d20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
14d30 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
14d40 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
14d50 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
14d60 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65   much of this re
14d70 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  ad request as po
14d80 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
14d90 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
14da0 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
14db0 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
14dc0 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
14dd0 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
14de0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14df0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
14e00 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
14e10 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
14e20 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
14e30 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
14e40 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d  on))[offset], am
14e50 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  t);.      OSTRAC
14e60 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 70 69  E(("READ-MMAP pi
14e70 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
14e80 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14e90 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
14ea0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
14eb0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
14ec0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
14ed0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
14ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14f00 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29  nt nCopy = (int)
14f10 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  (pFile->mmapSize
14f20 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20   - offset);.    
14f30 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
14f40 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
14f50 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
14f60 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
14f70 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
14f80 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
14f90 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
14fa0 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
14fb0 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
14fc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
14fd0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
14fe0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
14ff0 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
15000 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 69  LAPPED).  if( wi
15010 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
15020 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
15030 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
15040 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
15050 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
15060 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20  LITE_FULL\n",.  
15070 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
15080 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
15090 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
150a0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
150b0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
150c0 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
150d0 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
150e0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
150f0 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ead, 0) ){.#else
15100 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c  .  memset(&overl
15110 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
15120 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
15130 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
15140 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
15150 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
15160 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
15170 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
15180 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
15190 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
151a0 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
151b0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
151c0 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
151d0 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26   &overlapped) &&
151e0 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c  .         osGetL
151f0 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f  astError()!=ERRO
15200 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a  R_HANDLE_EOF ){.
15210 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44  #endif.    DWORD
15220 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
15230 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  if( winRetryIoer
15240 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
15250 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
15260 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
15270 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
15280 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
15290 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c  (("READ pid=%lu,
152a0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
152b0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
152c0 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20  ERR_READ\n",.   
152d0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
152e0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
152f0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
15300 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
15310 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
15320 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
15330 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15340 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15350 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61           "winRea
15360 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
15370 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49  );.  }.  winLogI
15380 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c  oerr(nRetry, __L
15390 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 6e 52  INE__);.  if( nR
153a0 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
153b0 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
153c0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
153d0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
153e0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
153f0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
15400 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
15410 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
15420 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
15430 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
15440 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
15450 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15460 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20  _READ\n",.      
15470 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
15480 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
15490 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
154a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
154b0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
154c0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _READ;.  }..  OS
154d0 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64  TRACE(("READ pid
154e0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
154f0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15500 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
15510 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
15520 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
15530 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
15540 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15550 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
15560 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
15570 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
15580 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
15590 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
155a0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
155b0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
155c0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
155d0 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
155e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
155f0 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
15600 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
15610 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
15620 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15640 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
15650 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
15660 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15680 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15690 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
156a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
156b0 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
156c0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
156d0 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
156e0 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
156f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
15720 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
15730 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
15740 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
15750 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
15760 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
15770 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
15780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15790 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
157a0 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
157b0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
157c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
157d0 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
157e0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
157f0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
15800 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
15810 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
15820 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
15830 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
15840 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
15850 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62  e=%p, file=%p, b
15860 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
15870 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
15880 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20    "offset=%lld, 
15890 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65  lock=%d\n", osGe
158a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
158b0 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20  d(), pFile,.    
158c0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
158d0 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
158e0 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
158f0 79 70 65 29 29 3b 0a 0a 23 69 66 20 64 65 66 69  ype));..#if defi
15900 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  ned(SQLITE_MMAP_
15910 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51  READWRITE) && SQ
15920 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
15930 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
15940 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
15950 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
15960 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
15970 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
15980 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
15990 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
159a0 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
159b0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
159c0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
159d0 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
159e0 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
159f0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
15a00 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
15a10 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
15a20 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
15a30 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
15a40 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
15a50 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  -MMAP pid=%lu, p
15a60 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15a70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
15a80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15a90 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
15aa0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15ab0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15ac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15ad0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
15ae0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  .      int nCopy
15af0 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e   = (int)(pFile->
15b00 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
15b10 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
15b20 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d  (&((u8 *)(pFile-
15b30 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
15b40 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f  fset], pBuf, nCo
15b50 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
15b60 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
15b70 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
15b80 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
15b90 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
15ba0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
15bb0 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
15bc0 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69  OS_WINCE || defi
15bd0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
15be0 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a  _NO_OVERLAPPED).
15bf0 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 69    rc = winSeekFi
15c00 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
15c10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
15c20 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64  {.#else.  {.#end
15c30 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
15c40 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69  S_WINCE && !defi
15c50 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
15c60 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a  _NO_OVERLAPPED).
15c70 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
15c80 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
15c90 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
15ca0 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a  for WriteFile. *
15cb0 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20  /.#endif.    u8 
15cc0 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42  *aRem = (u8 *)pB
15cd0 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  uf;        /* Da
15ce0 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  ta yet to be wri
15cf0 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
15d00 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20  nRem = amt;     
15d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15d20 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74  ber of bytes yet
15d30 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
15d40 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69  /.    DWORD nWri
15d50 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
15d60 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69      /* Bytes wri
15d70 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69  tten by each Wri
15d80 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f  teFile() call */
15d90 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
15da0 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
15db0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
15dc0 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
15dd0 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21  rror() */..#if !
15de0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15df0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15e00 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
15e10 4c 41 50 50 45 44 29 0a 20 20 20 20 6d 65 6d 73  LAPPED).    mems
15e20 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
15e30 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
15e40 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72  PPED));.    over
15e50 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
15e60 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
15e70 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0xffffffff);.   
15e80 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
15e90 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
15ea0 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
15eb0 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
15ec0 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  if..    while( n
15ed0 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c  Rem>0 ){.#if SQL
15ee0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
15ef0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
15f00 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
15f10 45 44 29 0a 20 20 20 20 20 20 69 66 28 20 21 6f  ED).      if( !o
15f20 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
15f30 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
15f40 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a   &nWrite, 0) ){.
15f50 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
15f60 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69  !osWriteFile(pFi
15f70 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65  le->h, aRem, nRe
15f80 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65  m, &nWrite, &ove
15f90 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64  rlapped) ){.#end
15fa0 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  if.        if( w
15fb0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52  inRetryIoerr(&nR
15fc0 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
15fd0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
15fe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15ff0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
16000 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  t( nWrite==0 || 
16010 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e  nWrite<=(DWORD)n
16020 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rem );.      if(
16030 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
16040 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
16050 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
16060 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
16070 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
16080 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16090 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
160a0 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
160b0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
160c0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
160d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57      offset += nW
160e0 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72  rite;.      over
160f0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
16100 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
16110 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0xffffffff);.   
16120 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
16130 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
16140 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
16150 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65   0x7fffffff);.#e
16160 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20  ndif.      aRem 
16170 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
16180 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b   nRem -= nWrite;
16190 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
161a0 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  Rem>0 ){.      p
161b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
161c0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
161d0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
161e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29  .  }..  if( rc )
161f0 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46  {.    if(   ( pF
16200 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
16210 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53  ERROR_HANDLE_DIS
16220 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20  K_FULL ).       
16230 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74  || ( pFile->last
16240 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53  Errno==ERROR_DIS
16250 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20  K_FULL )){.     
16260 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
16270 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
16280 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
16290 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a  SQLITE_FULL\n",.
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
162b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
162c0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
162d0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
162e0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
162f0 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  ror(SQLITE_FULL,
16300 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16310 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
16320 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
16330 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  Write1", pFile->
16340 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
16350 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
16360 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
16370 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
16380 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  =SQLITE_IOERR_WR
16390 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ITE\n",.        
163a0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
163b0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
163c0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
163d0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
163e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
163f0 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c  OERR_WRITE, pFil
16400 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32 22       "winWrite2"
16430 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
16440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69  .  }else{.    wi
16450 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79  nLogIoerr(nRetry
16460 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
16470 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
16480 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
16490 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
164a0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
164b0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
164c0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
164d0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
164e0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
164f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16500 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
16510 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
16520 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
16530 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54  .static int winT
16540 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
16550 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
16560 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
16570 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
16580 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
16590 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
165a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
165b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
165d0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20  Return code for 
165e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
165f0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
16600 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  no;..  assert( p
16610 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
16620 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
16630 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
16640 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41  UNCATE);.  OSTRA
16650 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 70 69  CE(("TRUNCATE pi
16660 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16670 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25   file=%p, size=%
16680 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  lld, lock=%d\n",
16690 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
166a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
166b0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
166c0 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69  e->h, nByte, pFi
166d0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
166e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
166f0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
16700 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
16710 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
16720 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
16730 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
16740 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
16750 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
16760 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
16770 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
16780 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
16790 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
167a0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
167b0 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
167c0 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
167d0 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
167e0 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
167f0 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
16800 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
16810 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
16820 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
16830 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  k;.  }..  /* Set
16840 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75  EndOfFile() retu
16850 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65  rns non-zero whe
16860 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  n successful, or
16870 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61   zero when it fa
16880 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69  ils. */.  if( wi
16890 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
168a0 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72   nByte) ){.    r
168b0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
168c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
168d0 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  NCATE, pFile->la
168e0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16900 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46  inTruncate1", pF
16910 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
16920 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65  else if( 0==osSe
16930 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65  tEndOfFile(pFile
16940 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20  ->h) &&.        
16950 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20      ((lastErrno 
16960 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
16970 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f  ())!=ERROR_USER_
16980 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a  MAPPED_FILE) ){.
16990 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
169a0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
169b0 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
169c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
169d0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
169e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
16a10 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
16a20 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  h);.  }..#if SQL
16a30 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
16a40 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  E>0.  /* If the 
16a50 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74  file was truncat
16a60 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
16a70 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
16a80 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70  rrently.  ** map
16a90 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
16aa0 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
16ab0 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
16ac0 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
16ad0 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64  ll.  ** use read
16ae0 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
16af0 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
16b00 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
16b10 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a  from now on..  *
16b20 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
16b30 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79  MapRegion && nBy
16b40 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  te<pFile->mmapSi
16b50 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ze ){.    pFile-
16b60 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
16b70 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
16b80 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
16b90 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
16ba0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
16bb0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
16bc0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16bd0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16be0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  ile, pFile->h, s
16bf0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
16c00 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
16c10 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
16c20 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
16c30 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
16c40 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
16c50 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
16c60 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
16c70 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
16c80 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
16c90 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20  are occuring at 
16ca0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
16cb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16cc0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16cd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
16ce0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16cf0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
16d00 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
16d10 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
16d20 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
16d30 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
16d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
16d50 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
16d60 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73  e *id, int flags
16d70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
16d80 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20  E_NO_SYNC.  /*. 
16d90 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68   ** Used only wh
16da0 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  en SQLITE_NO_SYN
16db0 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  C is not defined
16dc0 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72  ..   */.  BOOL r
16dd0 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  c;.#endif.#if !d
16de0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
16df0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
16e00 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a  E_NO_SYNC) || \.
16e10 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49      defined(SQLI
16e20 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
16e30 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  ).  /*.  ** Used
16e40 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
16e50 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
16e60 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61  ned and by the a
16e70 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20  ssert() and/or. 
16e80 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61   ** OSTRACE() ma
16e90 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69  cros..   */.  wi
16ea0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
16eb0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c  winFile*)id;.#el
16ec0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
16ed0 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69  METER(id);.#endi
16ee0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
16ef0 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b  le );.  /* Check
16f00 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c   that one of SQL
16f10 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
16f20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73  or FULL was pass
16f30 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  ed */.  assert((
16f40 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
16f50 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a  ITE_SYNC_NORMAL.
16f60 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26        || (flags&
16f70 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
16f80 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20  NC_FULL.  );..  
16f90 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20  /* Unix cannot, 
16fa0 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  but some systems
16fb0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
16fc0 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72  TE_FULL from her
16fd0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e  e. This.  ** lin
16fe0 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61  e is to test tha
16ff0 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20  t doing so does 
17000 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72  not cause any pr
17010 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53  oblems..  */.  S
17020 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
17030 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
17040 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f  ITE_FULL );..  O
17050 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69  STRACE(("SYNC pi
17060 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
17070 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d   file=%p, flags=
17080 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  %x, lock=%d\n",.
17090 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
170a0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
170b0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
170c0 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  ->h, flags,.    
170d0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
170e0 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64  cktype));..#ifnd
170f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
17100 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17110 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a  R(flags);.#else.
17120 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30    if( (flags&0x0
17130 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
17140 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  FULL ){.    sqli
17150 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
17160 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nt++;.  }.  sqli
17170 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
17180 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
17190 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
171a0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
171b0 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
171c0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
171d0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
171e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
171f0 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22  YNC.  OSTRACE(("
17200 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d 25 6c 75  SYNC-NOP pid=%lu
17210 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
17220 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
17230 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
17240 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
17250 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
17260 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
17270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17280 0a 23 65 6c 73 65 0a 23 69 66 20 53 51 4c 49 54  .#else.#if SQLIT
17290 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
172a0 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  0.  if( pFile->p
172b0 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  MapRegion ){.   
172c0 20 69 66 28 20 6f 73 46 6c 75 73 68 56 69 65 77   if( osFlushView
172d0 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d  OfFile(pFile->pM
172e0 61 70 52 65 67 69 6f 6e 2c 20 30 29 20 29 7b 0a  apRegion, 0) ){.
172f0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17300 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c  SYNC-MMAP pid=%l
17310 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
17320 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
17340 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 6f  =SQLITE_OK\n", o
17350 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
17360 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20 20  ssId(),.        
17370 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70 46         pFile, pF
17380 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
17390 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
173a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
173b0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
173c0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
173d0 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d  STRACE(("SYNC-MM
173e0 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AP pid=%lu, pFil
173f0 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  e=%p, pMapRegion
17400 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
17410 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45        "rc=SQLITE
17420 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20  _IOERR_MMAP\n", 
17430 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
17440 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20  essId(),.       
17450 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70          pFile, p
17460 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
17470 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
17480 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
17490 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
174a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
174b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
174c0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
174d0 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ync1", pFile->zP
174e0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
174f0 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 6f 73  #endif.  rc = os
17500 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
17510 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69  (pFile->h);.  Si
17520 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
17530 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28  c=FALSE );.  if(
17540 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41   rc ){.    OSTRA
17550 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c  CE(("SYNC pid=%l
17560 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
17570 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
17580 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
17590 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
175a0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
175b0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
175c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
175d0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
175e0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
175f0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
17600 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52  rror();.    OSTR
17610 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25  ACE(("SYNC pid=%
17620 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
17630 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
17640 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c  _IOERR_FSYNC\n",
17650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
17660 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
17670 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
17680 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
17690 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
176a0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
176b0 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  YNC, pFile->last
176c0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
176e0 69 6e 53 79 6e 63 32 22 2c 20 70 46 69 6c 65 2d  inSync2", pFile-
176f0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e  >zPath);.  }.#en
17700 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  dif.}../*.** Det
17710 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
17720 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
17730 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
17740 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
17750 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
17760 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
17770 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
17780 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
17790 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
177a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
177b0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
177c0 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
177d0 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20  t( pSize!=0 );. 
177e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
177f0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
17800 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f  OERR_FSTAT);.  O
17810 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
17820 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c  le=%p, pSize=%p\
17830 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53  n", pFile->h, pS
17840 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ize));..#if SQLI
17850 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a  TE_OS_WINRT.  {.
17860 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52      FILE_STANDAR
17870 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20  D_INFO info;.   
17880 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e   if( osGetFileIn
17890 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
178a0 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69  eEx(pFile->h, Fi
178b0 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a  leStandardInfo,.
178c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178e0 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65       &info, size
178f0 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20  of(info)) ){.   
17900 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f     *pSize = info
17910 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50  .EndOfFile.QuadP
17920 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
17930 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
17940 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17950 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
17960 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
17970 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
17980 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
17990 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
179b0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
179c0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
179d0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b   }.  }.#else.  {
179e0 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72  .    DWORD upper
179f0 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
17a00 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44  lowerBits;.    D
17a10 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
17a20 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  .    lowerBits =
17a30 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70   osGetFileSize(p
17a40 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42  File->h, &upperB
17a50 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  its);.    *pSize
17a60 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   = (((sqlite3_in
17a70 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c  t64)upperBits)<<
17a80 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b  32) + lowerBits;
17a90 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65  .    if(   (lowe
17aa0 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44  rBits == INVALID
17ab0 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20  _FILE_SIZE).    
17ac0 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
17ad0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
17ae0 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
17af0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
17b00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
17b10 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63  tErrno;.      rc
17b20 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
17b30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
17b40 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
17b50 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
17b60 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
17b70 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
17b80 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
17b90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
17ba0 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65  RACE(("SIZE file
17bb0 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a  =%p, pSize=%p, *
17bc0 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25  pSize=%lld, rc=%
17bd0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
17be0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
17bf0 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74 65  , *pSize, sqlite
17c00 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
17c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17c20 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46  /*.** LOCKFILE_F
17c30 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
17c40 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20  is undefined on 
17c50 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73  some Windows sys
17c60 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
17c70 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
17c80 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66  MMEDIATELY.# def
17c90 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  ine LOCKFILE_FAI
17ca0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a  L_IMMEDIATELY 1.
17cb0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
17cc0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
17cd0 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  VE_LOCK.# define
17ce0 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
17cf0 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69  IVE_LOCK 2.#endi
17d00 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69  f../*.** Histori
17d10 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61  cally, SQLite ha
17d20 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20  s used both the 
17d30 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63  LockFile and Loc
17d40 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
17d50 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c  s..** When the L
17d60 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e  ockFile function
17d70 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61   was used, it wa
17d80 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  s always expecte
17d90 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d  d to fail.** imm
17da0 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
17db0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
17dc0 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73  e obtained.  Als
17dd0 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70  o, it always exp
17de0 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61  ected to.** obta
17df0 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  in an exclusive 
17e00 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61  lock.  These fla
17e10 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  gs are used with
17e20 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
17e30 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  function.** and 
17e40 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78  reflect those ex
17e50 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72  pectations; ther
17e60 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75  efore, they shou
17e70 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ld not be change
17e80 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
17e90 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
17ea0 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  AGS.# define SQL
17eb0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
17ec0 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46  GS   (LOCKFILE_F
17ed0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
17ee0 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45        LOCKFILE_E
17f10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23  XCLUSIVE_LOCK).#
17f20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72  endif../*.** Cur
17f30 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e  rently, SQLite n
17f40 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c  ever calls the L
17f50 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
17f60 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69  on without wanti
17f70 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  ng the.** call t
17f80 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65  o fail immediate
17f90 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ly if the lock c
17fa0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
17fb0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
17fc0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
17fd0 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
17fe0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
17ff0 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45  _FLAGS (LOCKFILE
18000 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
18010 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Y).#endif../*.**
18020 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65   Acquire a reade
18030 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65  r lock..** Diffe
18040 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65  rent API routine
18050 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70  s are called dep
18060 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
18070 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a  r or not this.**
18080 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e   is Win9x or Win
18090 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NT..*/.static in
180a0 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b  t winGetReadLock
180b0 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
180c0 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f  {.  int res;.  O
180d0 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
180e0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
180f0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
18100 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
18110 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  e));.  if( osIsN
18120 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
18130 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f  E_OS_WINCE.    /
18140 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
18150 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
18160 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
18170 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
18180 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
18190 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49      **       API
181a0 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20   LockFileEx..   
181b0 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69   */.    res = wi
181c0 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nceLockFile(&pFi
181d0 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
181e0 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23  RST, 0, 1, 0);.#
181f0 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77  else.    res = w
18200 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
18210 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
18220 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53  KFILEEX_FLAGS, S
18230 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a  HARED_FIRST, 0,.
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
18260 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  E, 0);.#endif.  
18270 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
18280 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
18290 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c   else{.    int l
182a0 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  k;.    sqlite3_r
182b0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
182c0 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20  (lk), &lk);.    
182d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
182e0 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28  kByte = (short)(
182f0 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66  (lk & 0x7fffffff
18300 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
18310 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20   1));.    res = 
18320 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
18330 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
18340 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
18350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18360 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
18370 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
18380 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
18390 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
183a0 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20  f( res == 0 ){. 
183b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
183c0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
183d0 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e  rror();.    /* N
183e0 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20  o need to log a 
183f0 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20  failure to lock 
18400 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  */.  }.  OSTRACE
18410 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c  (("READ-LOCK fil
18420 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c  e=%p, result=%d\
18430 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
18440 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  s));.  return re
18450 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
18460 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
18470 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c  tatic int winUnl
18480 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  ockReadLock(winF
18490 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
184a0 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20  nt res;.  DWORD 
184b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54  lastErrno;.  OST
184c0 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f  RACE(("READ-UNLO
184d0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
184e0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
184f0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
18500 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  e));.  if( osIsN
18510 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  T() ){.    res =
18520 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
18530 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
18540 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
18550 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a  D_SIZE, 0);.  }.
18560 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
18570 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
18580 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  lse{.    res = w
18590 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
185a0 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
185b0 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72  IRST+pFile->shar
185c0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
185d0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
185e0 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  .  if( res==0 &&
185f0 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
18600 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
18610 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b  !=ERROR_NOT_LOCK
18620 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ED) ){.    pFile
18630 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
18640 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
18650 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
18660 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46  IOERR_UNLOCK, pF
18670 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f  "winUnlockReadLo
186a0 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
186b0 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  h);.  }.  OSTRAC
186c0 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
186d0 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
186e0 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
186f0 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e   res));.  return
18700 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   res;.}../*.** L
18710 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
18720 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
18730 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
18740 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
18750 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
18760 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
18770 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
18780 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
18790 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
187a0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
187b0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
187c0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
187d0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
187e0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
187f0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
18800 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
18810 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
18820 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
18830 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
18840 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
18850 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
18860 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
18870 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
18880 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
18890 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
188a0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
188b0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
188c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
188d0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
188e0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
188f0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
18900 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
18910 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
18920 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
18930 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
18940 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
18950 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
18960 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
18970 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
18980 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
18990 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
189a0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
189b0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
189c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
189d0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
189e0 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69   a lock.  The wi
189f0 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  nUnlock() routin
18a00 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20  e.** erases all 
18a10 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e  locks at once an
18a20 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d  d returns us imm
18a30 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b  ediately to lock
18a40 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20  ing level 0..** 
18a50 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
18a60 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20  le to lower the 
18a70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
18a80 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65  e step at a time
18a90 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67  .  You.** must g
18aa0 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f  o straight to lo
18ab0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
18ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18ad0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
18ae0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
18af0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
18b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
18b10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
18b20 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
18b30 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
18b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18b50 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77  sult of a Window
18b60 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20  s lock call */. 
18b70 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65   int newLocktype
18b80 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ;       /* Set p
18b90 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74  File->locktype t
18ba0 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66  o this value bef
18bb0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
18bc0 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
18bd0 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20  ock = 0;/* True 
18be0 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61  if we acquired a
18bf0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
18c00 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e  is time */.  win
18c10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
18c20 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57  inFile*)id;.  DW
18c30 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
18c40 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73  NO_ERROR;..  ass
18c50 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
18c60 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66  OSTRACE(("LOCK f
18c70 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d  ile=%p, oldLock=
18c80 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d  %d(%d), newLock=
18c90 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
18ca0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
18cb0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
18cc0 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
18cd0 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  te, locktype));.
18ce0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
18cf0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
18d00 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
18d10 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
18d20 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73  e on the.  ** Os
18d30 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
18d40 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
18d50 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
18d60 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c  ath, as.  ** sql
18d70 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
18d80 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
18d90 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
18da0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
18db0 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
18dc0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
18dd0 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d  "LOCK-HELD file=
18de0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
18df0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18e00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18e10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
18e20 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e   Do not allow an
18e30 79 20 6b 69 6e 64 20 6f 66 20 77 72 69 74 65 2d  y kind of write-
18e40 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61 64 2d 6f  lock on a read-o
18e50 6e 6c 79 20 64 61 74 61 62 61 73 65 0a 20 20 2a  nly database.  *
18e60 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
18e70 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
18e80 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d 30 20 26  ILE_RDONLY)!=0 &
18e90 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  & locktype>=RESE
18ea0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
18eb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18ec0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  OERR_LOCK;.  }..
18ed0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
18ee0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
18ef0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
18f00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
18f10 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
18f20 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
18f30 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
18f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
18f50 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
18f60 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
18f70 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
18f80 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
18f90 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
18fa0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
18fb0 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49  * Lock the PENDI
18fc0 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20  NG_LOCK byte if 
18fd0 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69  we need to acqui
18fe0 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
18ff0 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52  k or.  ** a SHAR
19000 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20  ED lock.  If we 
19010 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  are acquiring a 
19020 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
19030 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a   acquisition of.
19040 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47    ** the PENDING
19050 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65  _LOCK byte is te
19060 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  mporary..  */.  
19070 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46  newLocktype = pF
19080 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
19090 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
190a0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20  type==NO_LOCK.  
190b0 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
190c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
190d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
190e0 3c 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  <=RESERVED_LOCK)
190f0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
19100 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
19110 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
19120 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
19130 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
19140 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
19150 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49             PENDI
19180 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
19190 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
191a0 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
191b0 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
191c0 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20   lock.  This is 
191d0 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20  needed to work. 
191e0 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70       ** around p
191f0 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
19200 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f  y indexing and/o
19210 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66  r anti-virus sof
19220 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a  tware on.      *
19230 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
19240 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79  s..      ** If y
19250 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  ou are using thi
19260 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65  s code as a mode
19270 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76  l for alternativ
19280 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a  e VFSes, do not.
19290 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68        ** copy th
192a0 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20  is retry logic. 
192b0 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e   It is a hack in
192c0 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f  tended for Windo
192d0 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  ws only..      *
192e0 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  /.      lastErrn
192f0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
19300 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
19310 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49  ACE(("LOCK-PENDI
19320 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  NG-FAIL file=%p,
19330 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c   count=%d, resul
19340 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
19350 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
19360 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20  , cnt, res));.  
19370 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
19380 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44  o==ERROR_INVALID
19390 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20  _HANDLE ){.     
193a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
193b0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
193c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
193d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
193e0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
193f0 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
19400 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
19410 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
19420 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19430 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65  ->h, cnt, sqlite
19440 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
19450 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
19460 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
19470 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74   if( cnt ) sqlit
19480 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
19490 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
194a0 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65  PendingLock = re
194b0 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20  s;.    if( !res 
194c0 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  ){.      lastErr
194d0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
194e0 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
194f0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
19500 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
19510 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
19520 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
19530 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
19540 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
19550 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
19560 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74      res = winGet
19570 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
19580 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
19590 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
195a0 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
195b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
195c0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
195d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
195e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
195f0 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
19600 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
19610 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
19620 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
19630 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
19640 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
19650 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
19660 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
19670 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
19680 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
19690 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45  E_FLAGS, RESERVE
196a0 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
196b0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
196c0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
196d0 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
196e0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
196f0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
19700 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
19710 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
19720 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
19730 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
19740 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
19750 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
19760 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
19770 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
19780 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
19790 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
197a0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
197b0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
197c0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
197d0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
197e0 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
197f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
19800 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
19810 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
19820 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
19830 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
19840 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
19850 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
19860 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
19870 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44  LE_FLAGS, SHARED
19880 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20  _FIRST, 0,.     
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
198b0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
198c0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
198d0 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  pe = EXCLUSIVE_L
198e0 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
198f0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
19900 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
19910 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74  ();.      winGet
19920 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
19930 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19940 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69   If we are holdi
19950 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ng a PENDING loc
19960 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20  k that ought to 
19970 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  be released, the
19980 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69  n.  ** release i
19990 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
199a0 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  ( gotPendingLock
199b0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
199c0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
199d0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
199e0 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
199f0 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
19a00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
19a10 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  te the state of 
19a20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c  the lock has hel
19a30 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  d in the file de
19a40 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20  scriptor then.  
19a50 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70  ** return the ap
19a60 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74  propriate result
19a70 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   code..  */.  if
19a80 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20  ( res ){.    rc 
19a90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
19aa0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
19ab0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
19ac0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
19ad0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
19ae0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
19af0 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77  -FAIL file=%p, w
19b00 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64  anted=%d, got=%d
19b10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19b20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b    pFile->h, lock
19b30 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70  type, newLocktyp
19b40 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  e));.  }.  pFile
19b50 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
19b60 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20  )newLocktype;.  
19b70 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66  OSTRACE(("LOCK f
19b80 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
19b90 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
19ba0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
19bb0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
19bc0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
19bd0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
19be0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
19bf0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
19c00 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
19c10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
19c20 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
19c30 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
19c40 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
19c50 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
19c60 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
19c70 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
19c80 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
19c90 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
19ca0 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
19cb0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
19cc0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
19cd0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
19ce0 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  es;.  winFile *p
19cf0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
19d00 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
19d10 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
19d20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
19d30 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
19d40 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
19d50 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
19d60 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c  =%p, pResOut=%p\
19d70 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52  n", pFile->h, pR
19d80 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65  esOut));..  asse
19d90 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69  rt( id!=0 );.  i
19da0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
19db0 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
19dc0 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31  K ){.    res = 1
19dd0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
19de0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
19df0 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20  e=%p, result=%d 
19e00 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c  (local)\n", pFil
19e10 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d  e->h, res));.  }
19e20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
19e30 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
19e40 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
19e50 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52  CKFILEEX_FLAGS,R
19e60 45 53 45 52 56 45 44 5f 42 59 54 45 2c 30 2c 31  ESERVED_BYTE,0,1
19e70 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ,0);.    if( res
19e80 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c   ){.      winUnl
19e90 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
19ea0 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
19eb0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
19ec0 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65 73  }.    res = !res
19ed0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
19ee0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
19ef0 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20  e=%p, result=%d 
19f00 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
19f10 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
19f20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
19f30 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
19f40 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
19f50 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
19f60 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
19f70 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
19f80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19f90 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ->h, pResOut, *p
19fa0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
19fb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19fc0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
19fd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
19fe0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
19ff0 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
1a000 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
1a010 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
1a020 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
1a030 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
1a040 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1a050 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
1a060 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
1a070 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
1a080 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1a090 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
1a0a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a0b0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
1a0c0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1a0d0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
1a0e0 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
1a0f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1a100 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
1a110 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
1a120 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
1a130 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
1a140 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
1a150 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1a160 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
1a170 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
1a180 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1a190 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
1a1a0 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
1a1b0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
1a1c0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
1a1d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a1e0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
1a1f0 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
1a200 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
1a210 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
1a220 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
1a230 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d  ile=%p, oldLock=
1a240 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d  %d(%d), newLock=
1a250 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1a260 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
1a270 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
1a280 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
1a290 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  te, locktype));.
1a2a0 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
1a2b0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
1a2c0 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
1a2d0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
1a2e0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1a2f0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
1a300 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
1a310 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
1a320 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
1a330 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74 52  LOCK && !winGetR
1a340 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
1a350 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1a360 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
1a370 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
1a380 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
1a390 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
1a3a0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
1a3b0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
1a3c0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1a3d0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
1a3e0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1a3f0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1a400 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
1a410 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
1a420 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
1a430 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
1a440 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
1a450 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
1a460 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
1a470 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
1a480 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  0);.  }.  if( lo
1a490 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
1a4a0 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  && type>=SHARED_
1a4b0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
1a4c0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
1a4d0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
1a4e0 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
1a4f0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
1a500 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
1a510 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
1a520 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
1a530 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
1a540 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
1a550 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
1a560 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
1a570 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
1a580 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1a590 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
1a5a0 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
1a5b0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
1a5c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a  turn rc;.}../***
1a5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1a620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
1a640 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
1a650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1a670 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
1a680 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
1a690 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
1a6a0 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
1a6b0 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
1a6c0 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
1a6d0 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
1a6e0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
1a6f0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
1a700 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
1a710 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1a720 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
1a730 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
1a740 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
1a750 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
1a760 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
1a770 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
1a780 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
1a790 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
1a7a0 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
1a7b0 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
1a7c0 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
1a7d0 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
1a7e0 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
1a7f0 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
1a800 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
1a810 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
1a820 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
1a830 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
1a840 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
1a850 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
1a860 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
1a870 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
1a880 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
1a890 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
1a8a0 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
1a8b0 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
1a8c0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
1a8d0 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
1a8e0 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
1a8f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
1a900 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
1a910 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
1a920 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
1a930 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
1a940 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
1a950 74 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b 28  t winNolockLock(
1a960 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a970 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
1a980 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1a990 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55 53 45  TER(id);.  UNUSE
1a9a0 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f 63 6b  D_PARAMETER(lock
1a9b0 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
1a9c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
1a9d0 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f  atic int winNolo
1a9e0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1a9f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1aa00 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
1aa10 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
1aa20 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 55  RAMETER(id);.  U
1aa30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1aa40 70 52 65 73 4f 75 74 29 3b 0a 20 20 72 65 74 75  pResOut);.  retu
1aa50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1aa60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e  .static int winN
1aa70 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
1aa80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1aa90 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 55  t locktype){.  U
1aaa0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1aab0 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id);.  UNUSED_PA
1aac0 52 41 4d 45 54 45 52 28 6c 6f 63 6b 74 79 70 65  RAMETER(locktype
1aad0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1aae0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  TE_OK;.}../*****
1aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1ab00 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20  nd of the no-op 
1ab10 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1ab20 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
1ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab80 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1ab90 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69   If *pArg is ini
1aba0 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
1abb0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
1abc0 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
1abd0 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
1abe0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1abf0 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
1ac00 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
1ac10 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
1ac20 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1ac30 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
1ac40 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
1ac50 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
1ac60 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
1ac70 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
1ac80 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a  odeBit(winFile *
1ac90 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1aca0 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1acb0 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1acc0 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1acd0 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1ace0 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1acf0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1ad00 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1ad10 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1ad20 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1ad30 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1ad40 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1ad50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
1ad60 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
1ad70 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74  o VFS helper met
1ad80 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74 65  hods used for te
1ad90 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
1ada0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
1adb0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
1adc0 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a  e3_vfs *, char *
1add0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
1ade0 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
1adf0 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f  id *);.static BO
1ae00 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  OL winIsDriveLet
1ae10 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73  terAndColon(cons
1ae20 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a  t char *);../*.*
1ae30 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75  * Control and qu
1ae40 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ery of the open 
1ae50 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
1ae60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
1ae70 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1ae80 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1ae90 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1aea0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
1aeb0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
1aec0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 43  ;.  OSTRACE(("FC
1aed0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d  NTL file=%p, op=
1aee0 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20  %d, pArg=%p\n", 
1aef0 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41  pFile->h, op, pA
1af00 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20  rg));.  switch( 
1af10 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
1af20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
1af30 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
1af40 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1af50 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
1af60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1af70 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1af80 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1af90 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1afa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1afb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1afc0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41   SQLITE_FCNTL_LA
1afd0 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
1afe0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1aff0 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74  (int)pFile->last
1b000 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54  Errno;.      OST
1b010 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1b020 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b030 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1b040 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b060 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b070 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
1b080 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
1b090 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
1b0a0 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
1b0b0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1b0c0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1b0d0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
1b0e0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
1b0f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b100 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1b110 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1b120 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  INT: {.      if(
1b130 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
1b140 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1b150 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a  ite3_int64 oldSz
1b160 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
1b170 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69   = winFileSize(i
1b180 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20  d, &oldSz);.    
1b190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b1b0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1b1c0 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74   newSz = *(sqlit
1b1d0 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
1b1e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65            if( ne
1b1f0 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20  wSz>oldSz ){.   
1b200 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
1b210 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1b220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1b230 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
1b240 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20  id, newSz);.    
1b250 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1b260 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1b270 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b290 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1b2a0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
1b2b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
1b2c0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1b2d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1b2e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1b2f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b300 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1b310 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1b320 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1b330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b350 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
1b360 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20  RSIST_WAL: {.   
1b370 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46     winModeBit(pF
1b380 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52  ile, WINFILE_PER
1b390 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
1b3a0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
1b3b0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1b3c0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b3d0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1b3e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b3f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b400 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b410 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
1b420 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20  _OVERWRITE: {.  
1b430 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
1b440 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53  File, WINFILE_PS
1b450 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  OW, (int*)pArg);
1b460 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1b470 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1b480 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1b490 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1b4a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b4b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1b4c0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1b4d0 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  _VFSNAME: {.    
1b4e0 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1b4f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1b500 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70  f("%s", pFile->p
1b510 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Vfs->zName);.   
1b520 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b530 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b540 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b550 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b570 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b580 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
1b590 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
1b5a0 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
1b5b0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
1b5c0 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
1b5d0 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65        winIoerrRe
1b5e0 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20  try = a[0];.    
1b5f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b600 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72   a[0] = winIoerr
1b610 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Retry;.      }. 
1b620 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20       if( a[1]>0 
1b630 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f  ){.        winIo
1b640 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20  errRetryDelay = 
1b650 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[1];.      }els
1b660 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20  e{.        a[1] 
1b670 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  = winIoerrRetryD
1b680 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  elay;.      }.  
1b690 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b6a0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1b6b0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1b6c0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1b6d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b6e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b6f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
1b700 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c 45 3a 20  N32_GET_HANDLE: 
1b710 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45  {.      LPHANDLE
1b720 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e   phFile = (LPHAN
1b730 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20  DLE)pArg;.      
1b740 2a 70 68 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d  *phFile = pFile-
1b750 3e 68 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  >h;.      OSTRAC
1b760 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b770 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1b780 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b790 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b7a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1b7b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b7c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b7d0 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
1b7e0 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20  _HANDLE: {.     
1b7f0 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
1b800 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72   = (LPHANDLE)pAr
1b810 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  g;.      HANDLE 
1b820 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c 65  hOldFile = pFile
1b830 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ->h;.      pFile
1b840 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20  ->h = *phFile;. 
1b850 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 68       *phFile = h
1b860 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f  OldFile;.      O
1b870 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 6f  STRACE(("FCNTL o
1b880 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69  ldFile=%p, newFi
1b890 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1b8a0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1b8b0 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c         hOldFile,
1b8c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1b8d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b8e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
1b8f0 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  f.    case SQLIT
1b900 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
1b910 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
1b920 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a  ar *zTFile = 0;.
1b930 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
1b940 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  inGetTempname(pF
1b950 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69  ile->pVfs, &zTFi
1b960 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
1b970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b980 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1b990 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1b9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1b9b0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1b9c0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1b9d0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
1b9e0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1b9f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ba00 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
1ba10 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1ba20 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
1ba30 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1ba40 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20  ZE: {.      i64 
1ba50 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34  newLimit = *(i64
1ba60 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e  *)pArg;.      in
1ba70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ba80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
1ba90 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62  imit>sqlite3Glob
1baa0 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
1bab0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
1bac0 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  mit = sqlite3Glo
1bad0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
1bae0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1baf0 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
1bb00 20 6e 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 65   newLimit may be
1bb10 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 74   eventually cast
1bb20 20 74 6f 20 28 53 49 5a 45 5f 54 29 20 61 6e 64   to (SIZE_T) and
1bb30 20 70 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a   passed.      **
1bb40 20 74 6f 20 4d 61 70 56 69 65 77 4f 66 46 69 6c   to MapViewOfFil
1bb50 65 28 29 2e 20 52 65 73 74 72 69 63 74 20 69 74  e(). Restrict it
1bb60 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69  s value to 2GB i
1bb70 66 20 28 53 49 5a 45 5f 54 29 20 69 73 20 6e 6f  f (SIZE_T) is no
1bb80 74 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 6c 65  t at.      ** le
1bb90 61 73 74 20 61 20 36 34 2d 62 69 74 20 74 79 70  ast a 64-bit typ
1bba0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
1bbb0 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69  newLimit>0 && si
1bbc0 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3c 38 20 29  zeof(SIZE_T)<8 )
1bbd0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1bbe0 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26  it = (newLimit &
1bbf0 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20   0x7FFFFFFF);.  
1bc00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69      }..      *(i
1bc10 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  64*)pArg = pFile
1bc20 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1bc30 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1bc40 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74  t>=0 && newLimit
1bc50 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  !=pFile->mmapSiz
1bc60 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e  eMax && pFile->n
1bc70 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20  FetchOut==0 ){. 
1bc80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1bc90 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c  apSizeMax = newL
1bca0 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66  imit;.        if
1bcb0 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1bcc0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1bcd0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1bce0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
1bcf0 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28  rc = winMapfile(
1bd00 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20  pFile, -1);.    
1bd10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bd20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1bd30 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1bd40 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
1bd50 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1bd60 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
1bd70 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65  urn rc;.    }.#e
1bd80 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ndif.  }.  OSTRA
1bd90 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1bda0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f  %p, rc=SQLITE_NO
1bdb0 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65  TFOUND\n", pFile
1bdc0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
1bdd0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1bde0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1bdf0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1be00 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1be10 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1be20 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1be30 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1be40 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1be50 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1be60 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1be70 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1be80 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1be90 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1bea0 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1beb0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1bec0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1bed0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1bee0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1bef0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1bf00 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1bf10 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1bf20 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1bf30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1bf40 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1bf50 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1bf60 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1bf70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1bf80 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  inSectorSize(sql
1bf90 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
1bfa0 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65    (void)id;.  re
1bfb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1bfc0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1bfd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1bfe0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76   a vector of dev
1bff0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1c000 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
1c010 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  nt winDeviceChar
1c020 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
1c030 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1c040 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77   winFile *p = (w
1c050 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65  inFile*)id;.  re
1c060 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
1c070 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
1c080 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20  EN_OPEN |.      
1c090 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67     ((p->ctrlFlag
1c0a0 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  s & WINFILE_PSOW
1c0b0 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  )?SQLITE_IOCAP_P
1c0c0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1c0d0 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE:0);.}../*.** 
1c0e0 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c  Windows will onl
1c0f0 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65  y let you create
1c100 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69   file view mappi
1c110 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61  ngs.** on alloca
1c120 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c  tion size granul
1c130 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73  arity boundaries
1c140 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69  ..** During sqli
1c150 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65  te3_os_init() we
1c160 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49   do a GetSystemI
1c170 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20  nfo().** to get 
1c180 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  the granularity 
1c190 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
1c1a0 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53  SYSTEM_INFO winS
1c1b0 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66  ysInfo;..#ifndef
1c1c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1c1d0 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
1c1e0 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
1c1f0 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
1c200 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
1c210 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
1c220 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
1c230 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77  to protect the w
1c240 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  inLockInfo objec
1c250 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ts used by.** th
1c260 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
1c270 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
1c280 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
1c290 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
1c2a0 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
1c2b0 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
1c2c0 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
1c2d0 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
1c2e0 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  tex.** is held w
1c2f0 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
1c300 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
1c310 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
1c320 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20   of assert().** 
1c330 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
1c340 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
1c350 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
1c360 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
1c370 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
1c380 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
1c390 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
1c3a0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
1c3b0 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
1c3c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c3d0 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
1c3e0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1c3f0 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29  TEX_STATIC_VFS1)
1c400 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1c410 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1c420 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
1c430 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
1c440 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1c450 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1c460 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
1c470 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
1c480 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
1c490 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
1c4a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c4b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
1c4c0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
1c4d0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1c4e0 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e  IC_VFS1));.}.#en
1c4f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  dif../*.** Objec
1c500 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
1c510 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  ent a single fil
1c520 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61  e opened and mma
1c530 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a  pped to provide.
1c540 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ** shared memory
1c550 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .  When multiple
1c560 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
1c570 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a  erence the same.
1c580 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20  ** log-summary, 
1c590 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
1c5a0 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20  its own winFile 
1c5b0 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
1c5c0 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
1c5d0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
1c5e0 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
1c5f0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
1c600 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
1c610 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
1c620 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
1c630 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77  process..**.** w
1c640 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1c650 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
1c660 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
1c670 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
1c680 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
1c690 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
1c6a0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
1c6b0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
1c6c0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20        nRef.**   
1c6d0 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54     pNext.**.** T
1c6e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1c6f0 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
1c700 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
1c710 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
1c720 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a  *.**      fid.**
1c730 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
1c740 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
1c750 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
1c760 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
1c770 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
1c780 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
1c790 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
1c7a0 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
1c7b0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
1c7c0 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
1c7d0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
1c7e0 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
1c7f0 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
1c800 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1c810 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1c820 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1c830 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1c840 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1c850 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c860 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
1c870 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
1c880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1c890 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
1c8a0 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
1c8b0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
1c8c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c8d0 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
1c8e0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1c8f0 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
1c900 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1c910 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
1c920 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
1c930 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
1c940 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
1c950 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20 69  d-only */.  u8 i
1c960 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20  sUnlocked;      
1c970 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1c980 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20 68 65  f no DMS lock he
1c990 6c 64 20 2a 2f 0a 0a 20 20 73 74 72 75 63 74 20  ld */..  struct 
1c9a0 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20  ShmRegion {.    
1c9b0 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
1c9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1c9d0 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65   handle from Cre
1c9e0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a  ateFileMapping *
1c9f0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70  /.    void *pMap
1ca00 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a  ;.  } *aRegion;.
1ca10 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1ca20 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
1ca30 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
1ca40 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1ca50 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  I/O error */..  
1ca60 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
1ca70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ca80 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f  mber of winShm o
1ca90 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1caa0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
1cab0 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
1cac0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77          /* All w
1cad0 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
1cae0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1caf0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1cb00 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f  pNext;         /
1cb10 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f  * Next in list o
1cb20 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
1cb30 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20   objects */.#if 
1cb40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1cb50 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1cb60 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f  (SQLITE_HAVE_OS_
1cb70 54 52 41 43 45 29 0a 20 20 75 38 20 6e 65 78 74  TRACE).  u8 next
1cb80 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
1cb90 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
1cba0 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20  lable winShm.id 
1cbb0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
1cbc0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62  };../*.** A glob
1cbd0 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20  al array of all 
1cbe0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1cbf0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69  ts..**.** The wi
1cc00 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1cc10 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69  must be true whi
1cc20 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
1cc30 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e  iting this list.
1cc40 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68  .*/.static winSh
1cc50 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64  mNode *winShmNod
1cc60 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
1cc70 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
1cc80 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
1cc90 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
1cca0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
1ccb0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
1ccc0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
1ccd0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
1cce0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1ccf0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
1cd00 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
1cd10 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
1cd20 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
1cd30 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
1cd40 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d  *    winShm.pShm
1cd50 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68  Node.**    winSh
1cd60 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
1cd70 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
1cd80 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
1cd90 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
1cda0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
1cdb0 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
1cdc0 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
1cdd0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
1cde0 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20  /.struct winShm 
1cdf0 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
1ce00 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f  pShmNode;      /
1ce10 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1ce20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1ce30 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ct */.  winShm *
1ce40 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
1ce50 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68     /* Next winSh
1ce60 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
1ce70 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1ce80 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
1ce90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1cea0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
1ceb0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74  e winShmNode mut
1cec0 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  ex */.  u16 shar
1ced0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1cee0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
1cef0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
1cf00 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
1cf10 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1cf20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1cf30 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1cf40 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1cf50 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1cf60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
1cf70 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20  AVE_OS_TRACE).  
1cf80 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
1cf90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
1cfa0 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
1cfb0 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
1cfc0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
1cfd0 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
1cfe0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
1cff0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
1d000 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
1d010 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
1d020 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
1d030 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
1d040 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
1d050 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
1d060 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
1d070 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
1d080 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
1d090 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
1d0a0 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
1d0b0 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
1d0c0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
1d0d0 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  st..*/.#define W
1d0e0 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23  INSHM_UNLCK  1.#
1d0f0 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f 52 44  define WINSHM_RD
1d100 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 57  LCK  2.#define W
1d110 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73  INSHM_WRLCK  3.s
1d120 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1d130 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
1d140 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
1d150 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
1d160 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
1d170 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
1d180 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
1d190 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
1d1a0 20 2f 2a 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b   /* WINSHM_UNLCK
1d1b0 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 2c 20  , WINSHM_RDLCK, 
1d1c0 6f 72 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20  or WINSHM_WRLCK 
1d1d0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1d1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1d1f0 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
1d200 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
1d210 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
1d220 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
1d230 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d240 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
1d250 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
1d260 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1d270 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1d280 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f   code form Lock/
1d290 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a  UnlockFileEx() *
1d2a0 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
1d2b0 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  o the winShmNode
1d2c0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
1d2d0 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
1d2e0 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
1d2f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d300 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
1d310 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66  ) || pFile->nRef
1d320 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ==0 );..  OSTRAC
1d330 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c  E(("SHM-LOCK fil
1d340 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f  e=%p, lock=%d, o
1d350 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
1d360 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1d370 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
1d380 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c   lockType, ofst,
1d390 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20   nByte));..  /* 
1d3a0 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
1d3b0 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1d3c0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
1d3d0 6f 63 6b 54 79 70 65 3d 3d 57 49 4e 53 48 4d 5f  ockType==WINSHM_
1d3e0 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  UNLCK ){.    rc 
1d3f0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
1d400 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
1d410 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
1d420 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
1d430 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1d440 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
1d450 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57  meters */.    DW
1d460 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f  ORD dwFlags = LO
1d470 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
1d480 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28  DIATELY;.    if(
1d490 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 57 49 4e   lockType == WIN
1d4a0 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
1d4b0 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
1d4c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
1d4d0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
1d4e0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
1d4f0 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f  le.h, dwFlags, o
1d500 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
1d510 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
1d520 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  != 0 ){.    rc =
1d530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
1d540 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
1d550 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47  lastErrno =  osG
1d560 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1d570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1d580 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  USY;.  }..  OSTR
1d590 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66  ACE(("SHM-LOCK f
1d5a0 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c  ile=%p, func=%s,
1d5b0 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25   errno=%lu, rc=%
1d5c0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1d5d0 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
1d5e0 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 57 49   (lockType == WI
1d5f0 4e 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77  NSHM_UNLCK) ? "w
1d600 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a  inUnlockFile" :.
1d610 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c             "winL
1d620 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  ockFile", pFile-
1d630 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69  >lastErrno, sqli
1d640 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1d650 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1d660 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
1d670 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
1d680 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69  methods */.stati
1d690 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71  c int winOpen(sq
1d6a0 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74  lite3_vfs*,const
1d6b0 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66   char*,sqlite3_f
1d6c0 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a  ile*,int,int*);.
1d6d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
1d6e0 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
1d6f0 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69   *,const char*,i
1d700 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  nt);../*.** Purg
1d710 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  e the winShmNode
1d720 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
1d730 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69   entries with wi
1d740 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
1d750 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1d760 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
1d770 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
1d780 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
1d790 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
1d7a0 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
1d7b0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
1d7c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d7d0 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69  winShmPurge(sqli
1d7e0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1d7f0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a  nt deleteFlag){.
1d800 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70    winShmNode **p
1d810 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  p;.  winShmNode 
1d820 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69  *p;.  assert( wi
1d830 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1d840 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1d850 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75  HM-PURGE pid=%lu
1d860 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c  , deleteFlag=%d\
1d870 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1d880 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1d890 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c  ssId(), deleteFl
1d8a0 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69  ag));.  pp = &wi
1d8b0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
1d8c0 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29  while( (p = *pp)
1d8d0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
1d8e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1d8f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1d900 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20  if( p->mutex ){ 
1d910 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
1d920 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a  ee(p->mutex); }.
1d930 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1d940 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
1d950 29 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20  ){.        BOOL 
1d960 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65  bRc = osUnmapVie
1d970 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69  wOfFile(p->aRegi
1d980 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20  on[i].pMap);.   
1d990 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1d9a0 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70  HM-PURGE-UNMAP p
1d9b0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1d9c0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1d9e0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1d9f0 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
1da00 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1da10 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45  );.        UNUSE
1da20 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1da30 28 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62  (bRc);.        b
1da40 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  Rc = osCloseHand
1da50 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
1da60 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .hMap);.        
1da70 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1da80 52 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c  RGE-CLOSE pid=%l
1da90 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
1daa0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1dab0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1dac0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1dad0 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
1dae0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1daf0 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52        UNUSED_VAR
1db00 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29  IABLE_VALUE(bRc)
1db10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1db20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d  if( p->hFile.h!=
1db30 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65  NULL && p->hFile
1db40 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  .h!=INVALID_HAND
1db50 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
1db60 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1db70 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1db80 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
1db90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1dba0 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
1dbb0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1dbc0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1dbd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
1dbe0 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
1dbf0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1dc00 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1dc10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
1dc20 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
1dc30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
1dc40 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
1dc50 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
1dc60 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
1dc70 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1dc80 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1dc90 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1dca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1dcb0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
1dcc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1dcd0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
1dce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1dcf0 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
1dd00 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
1dd10 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1dd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
1dd30 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
1dd40 65 20 44 4d 53 20 6c 6f 63 6b 20 66 6f 72 20 74  e DMS lock for t
1dd50 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1dd60 65 2e 20 20 52 65 74 75 72 6e 73 0a 2a 2a 20 53  e.  Returns.** S
1dd70 51 4c 49 54 45 5f 4f 4b 20 75 70 6f 6e 20 73 75  QLITE_OK upon su
1dd80 63 63 65 73 73 2e 20 20 55 70 6f 6e 20 73 75 63  ccess.  Upon suc
1dd90 63 65 73 73 2c 20 74 68 65 20 69 6e 74 65 67 65  cess, the intege
1dda0 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
1ddb0 2a 2a 20 74 68 65 20 70 4c 6f 63 6b 54 79 70 65  ** the pLockType
1ddc0 20 61 72 67 75 6d 65 6e 74 20 77 69 6c 6c 20 62   argument will b
1ddd0 65 20 73 65 74 20 74 6f 20 74 68 65 20 6c 6f 63  e set to the loc
1dde0 6b 20 74 79 70 65 20 68 65 6c 64 20 62 79 20 74  k type held by t
1ddf0 68 65 0a 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63  he.** other proc
1de00 65 73 73 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ess, as follows:
1de10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 57 49 4e  .**.**       WIN
1de20 53 48 4d 5f 55 4e 4c 43 4b 20 2d 2d 20 4e 6f 20  SHM_UNLCK -- No 
1de30 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
1de40 6e 20 74 68 65 20 44 4d 53 2e 0a 2a 2a 20 20 20  n the DMS..**   
1de50 20 20 20 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b      WINSHM_RDLCK
1de60 20 2d 2d 20 41 20 53 48 41 52 45 44 20 6c 6f 63   -- A SHARED loc
1de70 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
1de80 20 44 4d 53 2e 0a 2a 2a 20 20 20 20 20 20 20 57   DMS..**       W
1de90 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 2d 2d 20 41  INSHM_WRLCK -- A
1dea0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1deb0 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
1dec0 44 4d 53 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  DMS..*/.static i
1ded0 6e 74 20 77 69 6e 47 65 74 53 68 6d 44 6d 73 4c  nt winGetShmDmsL
1dee0 6f 63 6b 54 79 70 65 28 0a 20 20 77 69 6e 46 69  ockType(.  winFi
1def0 6c 65 20 2a 70 46 69 6c 65 2c 20 2f 2a 20 46 69  le *pFile, /* Fi
1df00 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
1df10 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4c 6f 63 6b   */.  int *pLock
1df20 54 79 70 65 20 20 2f 2a 20 57 49 4e 53 48 4d 5f  Type  /* WINSHM_
1df30 55 4e 4c 43 4b 2c 20 57 49 4e 53 48 4d 5f 52 44  UNLCK, WINSHM_RD
1df40 4c 43 4b 2c 20 6f 72 20 57 49 4e 53 48 4d 5f 57  LCK, or WINSHM_W
1df50 52 4c 43 4b 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  RLCK */.){.#if !
1df60 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1df70 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1df80 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
1df90 4c 41 50 50 45 44 29 0a 20 20 4f 56 45 52 4c 41  LAPPED).  OVERLA
1dfa0 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
1dfb0 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
1dfc0 6f 72 20 52 65 61 64 46 69 6c 65 2f 57 72 69 74  or ReadFile/Writ
1dfd0 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66  eFile. */.#endif
1dfe0 0a 20 20 4c 50 56 4f 49 44 20 70 4f 76 65 72 6c  .  LPVOID pOverl
1dff0 61 70 70 65 64 20 3d 20 30 3b 0a 20 20 73 71 6c  apped = 0;.  sql
1e000 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1e010 74 20 3d 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 3b  t = WIN_SHM_DMS;
1e020 0a 20 20 42 59 54 45 20 6e 6f 74 55 73 65 64 31  .  BYTE notUsed1
1e030 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6e 6f   = 0;.  DWORD no
1e040 74 55 73 65 64 32 20 3d 20 30 3b 0a 0a 23 69 66  tUsed2 = 0;..#if
1e050 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1e060 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e070 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
1e080 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 69  LAPPED).  if( wi
1e090 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
1e0a0 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
1e0b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e0c0 45 52 52 5f 53 45 45 4b 3b 0a 20 20 7d 0a 23 65  ERR_SEEK;.  }.#e
1e0d0 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  lse.  memset(&ov
1e0e0 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
1e0f0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
1e100 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
1e110 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
1e120 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
1e130 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  ff);.  overlappe
1e140 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
1e150 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
1e160 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
1e170 3b 0a 20 20 70 4f 76 65 72 6c 61 70 70 65 64 20  ;.  pOverlapped 
1e180 3d 20 26 6f 76 65 72 6c 61 70 70 65 64 3b 0a 23  = &overlapped;.#
1e190 65 6e 64 69 66 0a 20 20 69 66 28 20 21 6f 73 57  endif.  if( !osW
1e1a0 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
1e1b0 68 2c 20 26 6e 6f 74 55 73 65 64 31 2c 20 31 2c  h, &notUsed1, 1,
1e1c0 20 26 6e 6f 74 55 73 65 64 32 2c 20 70 4f 76 65   &notUsed2, pOve
1e1d0 72 6c 61 70 70 65 64 29 20 29 7b 0a 20 20 20 20  rlapped) ){.    
1e1e0 69 66 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  if( !osReadFile(
1e1f0 70 46 69 6c 65 2d 3e 68 2c 20 26 6e 6f 74 55 73  pFile->h, &notUs
1e200 65 64 31 2c 20 31 2c 20 26 6e 6f 74 55 73 65 64  ed1, 1, &notUsed
1e210 32 2c 20 70 4f 76 65 72 6c 61 70 70 65 64 29 20  2, pOverlapped) 
1e220 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e  ){.      if( win
1e230 49 73 4c 6f 63 6b 69 6e 67 45 72 72 6f 72 28 6f  IsLockingError(o
1e240 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
1e250 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 6f   ){.        *pLo
1e260 63 6b 54 79 70 65 20 3d 20 57 49 4e 53 48 4d 5f  ckType = WINSHM_
1e270 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  WRLCK;.      }el
1e280 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1e290 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e2a0 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  READ;.      }.  
1e2b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1e2c0 66 28 20 77 69 6e 49 73 4c 6f 63 6b 69 6e 67 45  f( winIsLockingE
1e2d0 72 72 6f 72 28 6f 73 47 65 74 4c 61 73 74 45 72  rror(osGetLastEr
1e2e0 72 6f 72 28 29 29 20 29 7b 0a 20 20 20 20 20 20  ror()) ){.      
1e2f0 20 20 2a 70 4c 6f 63 6b 54 79 70 65 20 3d 20 57    *pLockType = W
1e300 49 4e 53 48 4d 5f 52 44 4c 43 4b 3b 0a 20 20 20  INSHM_RDLCK;.   
1e310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e330 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
1e340 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1e350 73 65 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 54 79  se{.    *pLockTy
1e360 70 65 20 3d 20 57 49 4e 53 48 4d 5f 55 4e 4c 43  pe = WINSHM_UNLC
1e370 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
1e380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e390 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f 63 6b  .** The DMS lock
1e3a0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1e3b0 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d 20 66  n taken on shm f
1e3c0 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20 41 74  ile pShmNode. At
1e3d0 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61 6b 65  tempt to.** take
1e3e0 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72 6e 20   it now. Return 
1e3f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
1e400 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1e410 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1e420 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1e430 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d 53 20  *.** If the DMS 
1e440 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64  cannot be locked
1e450 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
1e460 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d   a readonly_shm=
1e470 31 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  1.** connection 
1e480 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  and no other pro
1e490 63 65 73 73 20 61 6c 72 65 61 64 79 20 68 6f 6c  cess already hol
1e4a0 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65 74 75 72  ds a lock, retur
1e4b0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 45 41 44  n.** SQLITE_READ
1e4c0 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 61 6e  ONLY_CANTINIT an
1e4d0 64 20 73 65 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  d set pShmNode->
1e4e0 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f  isUnlocked=1..*/
1e4f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
1e500 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  ockSharedMemory(
1e510 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 2c 20  winFile *pDbFd, 
1e520 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1e530 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 6c 6f 63  Node){.  int loc
1e540 6b 54 79 70 65 3b 0a 20 20 69 6e 74 20 72 63 20  kType;.  int rc 
1e550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1e560 2f 2a 20 55 73 65 20 52 65 61 64 46 69 6c 65 2f  /* Use ReadFile/
1e570 57 72 69 74 65 46 69 6c 65 20 74 6f 20 64 65 74  WriteFile to det
1e580 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f 63 6b 73  ermine the locks
1e590 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1e5a0 20 61 72 65 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e   are.  ** holdin
1e5b0 67 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74  g on the DMS byt
1e5c0 65 2e 20 49 66 20 69 74 20 69 6e 64 69 63 61 74  e. If it indicat
1e5d0 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  es that another 
1e5e0 70 72 6f 63 65 73 73 20 69 73 0a 20 20 2a 2a 20  process is.  ** 
1e5f0 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44  holding a SHARED
1e600 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73   lock, then this
1e610 20 70 72 6f 63 65 73 73 20 6d 61 79 20 61 6c 73   process may als
1e620 6f 20 74 61 6b 65 20 61 20 53 48 41 52 45 44 0a  o take a SHARED.
1e630 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 70 72    ** lock and pr
1e640 6f 63 65 65 64 20 77 69 74 68 20 6f 70 65 6e 69  oceed with openi
1e650 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  ng the *-shm fil
1e660 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  e..  **.  ** Or,
1e670 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f   if no other pro
1e680 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
1e690 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
1e6a0 68 69 73 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  his process.  **
1e6b0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 6f   is the first to
1e6c0 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20 74 68 69   open it. In thi
1e6d0 73 20 63 61 73 65 20 74 61 6b 65 20 61 6e 20 45  s case take an E
1e6e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1e6f0 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53 20 62 79   the.  ** DMS by
1e700 74 65 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20  te and truncate 
1e710 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20 74  the *-shm file t
1e720 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
1e730 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20 2a 2a 20  size. Then.  ** 
1e740 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 53  downgrade to a S
1e750 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
1e760 65 20 44 4d 53 20 62 79 74 65 2e 0a 20 20 2a 2a  e DMS byte..  **
1e770 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  ** If another
1e780 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1e790 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
1e7a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53   lock on the DMS
1e7b0 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72 65 74 75   byte,.  ** retu
1e7c0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 74  rn SQLITE_BUSY t
1e7d0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 69 74  o the caller (it
1e7e0 20 77 69 6c 6c 20 74 72 79 20 61 67 61 69 6e 29   will try again)
1e7f0 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a 20 20 2a  . An earlier.  *
1e800 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  * version of thi
1e810 73 20 63 6f 64 65 20 61 74 74 65 6d 70 74 65 64  s code attempted
1e820 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
1e830 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   at this point. 
1e840 42 75 74 0a 20 20 2a 2a 20 74 68 69 73 20 69 6e  But.  ** this in
1e850 74 72 6f 64 75 63 65 64 20 61 20 73 75 62 74 6c  troduced a subtl
1e860 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
1e870 3a 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  : if the process
1e880 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 45 58   holding.  ** EX
1e890 43 4c 55 53 49 56 45 20 66 61 69 6c 65 64 20 6a  CLUSIVE failed j
1e8a0 75 73 74 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ust before trunc
1e8b0 61 74 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20  ating the *-shm 
1e8c0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  file, then this.
1e8d0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6d 69 67    ** process mig
1e8e0 68 74 20 6f 70 65 6e 20 61 6e 64 20 75 73 65 20  ht open and use 
1e8f0 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20 77  the *-shm file w
1e900 69 74 68 6f 75 74 20 74 72 75 6e 63 61 74 69 6e  ithout truncatin
1e910 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e 64 20 69  g it..  ** And i
1e920 66 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65  f the *-shm file
1e930 20 68 61 73 20 62 65 65 6e 20 63 6f 72 72 75 70   has been corrup
1e940 74 65 64 20 62 79 20 61 20 70 6f 77 65 72 20 66  ted by a power f
1e950 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a 2a 20 73  ailure or.  ** s
1e960 79 73 74 65 6d 20 63 72 61 73 68 2c 20 74 68 65  ystem crash, the
1e970 20 64 61 74 61 62 61 73 65 20 69 74 73 65 6c 66   database itself
1e980 20 6d 61 79 20 61 6c 73 6f 20 62 65 63 6f 6d 65   may also become
1e990 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20   corrupt.  */.  
1e9a0 69 66 28 20 77 69 6e 47 65 74 53 68 6d 44 6d 73  if( winGetShmDms
1e9b0 4c 6f 63 6b 54 79 70 65 28 26 70 53 68 6d 4e 6f  LockType(&pShmNo
1e9c0 64 65 2d 3e 68 46 69 6c 65 2c 20 26 6c 6f 63 6b  de->hFile, &lock
1e9d0 54 79 70 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  Type)!=SQLITE_OK
1e9e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1e9f0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
1ea00 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
1ea10 54 79 70 65 3d 3d 57 49 4e 53 48 4d 5f 55 4e 4c  Type==WINSHM_UNL
1ea20 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  CK ){.    if( pS
1ea30 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
1ea40 6c 79 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d  ly ){.      pShm
1ea50 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
1ea60 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
1ea70 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1ea80 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20 20 20 7d  _CANTINIT;.    }
1ea90 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 53  else{.      winS
1eaa0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1eab0 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e  mNode, WINSHM_UN
1eac0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1ead0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
1eae0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1eaf0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1eb00 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
1eb10 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
1eb20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eb30 4f 4b 20 26 26 20 77 69 6e 54 72 75 6e 63 61 74  OK && winTruncat
1eb40 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
1eb50 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1eb60 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  e, 0) ){.       
1eb70 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1eb80 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1eb90 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
1eba0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 22 77 69 6e 4c 6f 63 6b 53 68 61 72 65     "winLockShare
1ebd0 64 4d 65 6d 6f 72 79 22 2c 20 70 53 68 6d 4e 6f  dMemory", pShmNo
1ebe0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
1ebf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ec00 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
1ec10 70 65 3d 3d 57 49 4e 53 48 4d 5f 57 52 4c 43 4b  pe==WINSHM_WRLCK
1ec20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1ec30 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
1ec40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ec50 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1ec60 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 57 49 4e 53  ( lockType==WINS
1ec70 48 4d 5f 55 4e 4c 43 4b 20 7c 7c 20 6c 6f 63 6b  HM_UNLCK || lock
1ec80 54 79 70 65 3d 3d 57 49 4e 53 48 4d 5f 52 44 4c  Type==WINSHM_RDL
1ec90 43 4b 20 29 3b 0a 20 20 20 20 77 69 6e 53 68 6d  CK );.    winShm
1eca0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1ecb0 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43  ode, WINSHM_UNLC
1ecc0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1ecd0 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  1);.    rc = win
1ece0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1ecf0 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52  hmNode, WINSHM_R
1ed00 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
1ed10 53 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  S, 1);.  }..  re
1ed20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ed30 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
1ed40 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
1ed50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
1ed60 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
1ed70 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
1ed80 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
1ed90 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
1eda0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
1edb0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
1edc0 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
1edd0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
1ede0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
1edf0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
1ee00 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
1ee10 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
1ee20 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
1ee30 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
1ee40 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
1ee50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1ee60 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
1ee70 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
1ee80 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
1ee90 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  m *p;         /*
1eea0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1eeb0 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1eec0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1eed0 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 2f 2a 20 54  hmNode = 0; /* T
1eee0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
1eef0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
1ef00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ef10 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
1ef20 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  ult code */.  in
1ef30 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 45  t rc2 = SQLITE_E
1ef40 52 52 4f 52 3b 20 20 20 2f 2a 20 77 69 6e 4f 70  RROR;   /* winOp
1ef50 65 6e 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a  en result code *
1ef60 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1ef70 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
1ef80 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
1ef90 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1efa0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
1efb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1efc0 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62  ze of zName in b
1efd0 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ytes */..  asser
1efe0 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
1eff0 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70  0 );    /* Not p
1f000 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
1f010 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
1f020 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
1f030 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
1f040 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73   object.  Also s
1f050 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a  peculatively.  *
1f060 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
1f070 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68   for a new winSh
1f080 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61  mNode and filena
1f090 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  me..  */.  p = s
1f0a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1f0b0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
1f0c0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1f0d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1f0e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6e  _NOMEM_BKPT;.  n
1f0f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1f100 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50  rlen30(pDbFd->zP
1f110 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ath);.  pNew = s
1f120 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1f130 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
1f140 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  de) + nName + 17
1f150 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1f160 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1f170 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
1f180 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1f190 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
1f1a0 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  }.  pNew->zFilen
1f1b0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
1f1c0 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ew[1];.  sqlite3
1f1d0 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b  _snprintf(nName+
1f1e0 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  15, pNew->zFilen
1f1f0 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70  ame, "%s-shm", p
1f200 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1f210 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
1f220 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
1f230 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1f240 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f  );..  /* Look to
1f250 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
1f260 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e   an existing win
1f270 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e  ShmNode that can
1f280 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49   be used..  ** I
1f290 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69  f no matching wi
1f2a0 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74  nShmNode current
1f2b0 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74  ly exists, creat
1f2c0 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
1f2d0 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1f2e0 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53  utex();.  for(pS
1f2f0 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e  hmNode = winShmN
1f300 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64  odeList; pShmNod
1f310 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d  e; pShmNode=pShm
1f320 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Node->pNext){.  
1f330 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f    /* TBD need to
1f340 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65   come up with be
1f350 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e  tter match here.
1f360 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a    Perhaps.    **
1f370 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54   use FILE_ID_BOT
1f380 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63  H_DIR_INFO Struc
1f390 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
1f3a0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1f3b0 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  Cmp(pShmNode->zF
1f3c0 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  ilename, pNew->z
1f3d0 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62  Filename)==0 ) b
1f3e0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1f3f0 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20  pShmNode ){.    
1f400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1f410 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  w);.  }else{.   
1f420 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77   pShmNode = pNew
1f430 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1f440 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28      ((winFile*)(
1f450 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1f460 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  ))->h = INVALID_
1f470 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20  HANDLE_VALUE;.  
1f480 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78    pShmNode->pNex
1f490 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  t = winShmNodeLi
1f4a0 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f  st;.    winShmNo
1f4b0 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64  deList = pShmNod
1f4c0 65 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e;..    if( sqli
1f4d0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f4e0 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
1f4f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
1f500 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1f510 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1f520 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
1f530 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1f540 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1f550 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f560 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
1f570 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
1f580 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1f590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f5a0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
1f5b0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62  _uri_boolean(pDb
1f5c0 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64  Fd->zPath, "read
1f5d0 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b  only_shm", 0) ){
1f5e0 0a 20 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e  .      rc2 = win
1f5f0 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73  Open(pDbFd->pVfs
1f600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f610 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1f620 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f640 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
1f650 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 0a  ShmNode->hFile,.
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f670 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1f680 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  WAL|SQLITE_OPEN_
1f690 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1f6a0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20  _OPEN_CREATE,.  
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20    0);.    }.    
1f6d0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1f6e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20  OK ){.      rc2 
1f6f0 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d  = winOpen(pDbFd-
1f700 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20  >pVfs,.         
1f710 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
1f720 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ode->zFilename,.
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c      (sqlite3_fil
1f750 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  e*)&pShmNode->hF
1f760 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
1f770 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1f780 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
1f790 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
1f7a0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1f7b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f7c0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 20 20        0);.      
1f7d0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1f7e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f7f0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1f800 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
1f810 4b 50 54 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  KPT, osGetLastEr
1f820 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 53  "winOpenShm", pS
1f850 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1f860 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
1f870 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1f880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
1f890 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
1f8a0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 1;.    }..  
1f8b0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 53 68    rc = winLockSh
1f8c0 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
1f8d0 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20  , pShmNode);.   
1f8e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f8f0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1f900 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e  _READONLY_CANTIN
1f910 49 54 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  IT ) goto shm_op
1f920 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
1f930 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
1f940 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
1f950 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e  d of the winShmN
1f960 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
1f970 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
1f980 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1f990 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1f9a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
1f9b0 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 70 2d  E_OS_TRACE).  p-
1f9c0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
1f9d0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
1f9e0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
1f9f0 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
1fa00 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
1fa10 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1fa20 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
1fa30 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
1fa40 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
1fa50 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
1fa60 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
1fa70 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
1fa80 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1fa90 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
1faa0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
1fab0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
1fac0 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
1fad0 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
1fae0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
1faf0 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
1fb00 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
1fb10 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
1fb20 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
1fb30 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
1fb40 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
1fb50 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
1fb60 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
1fb70 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
1fb80 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
1fb90 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20  x.  ** mutex..  
1fba0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1fbb0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1fbc0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
1fbd0 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
1fbe0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
1fbf0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
1fc00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1fc10 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1fc20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1fc30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1fc40 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
1fc50 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
1fc60 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
1fc70 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1fc80 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f  ShmNode, WINSHM_
1fc90 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
1fca0 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d  MS, 1);.  winShm
1fcb0 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
1fcc0 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54  s, 0);      /* T
1fcd0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
1fce0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
1fcf0 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
1fd00 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69  _free(p);.  sqli
1fd10 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
1fd20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1fd30 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
1fd40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
1fd50 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
1fd60 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
1fd70 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
1fd80 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61  erlying.** stora
1fd90 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
1fda0 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
1fdb0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
1fdc0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
1fdd0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1fde0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1fdf0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1fe00 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
1fe10 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
1fe20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
1fe30 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
1fe40 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
1fe50 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
1fe60 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1fe70 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
1fe80 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1fe90 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
1fea0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1feb0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
1fec0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1fed0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
1fee0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
1fef0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
1ff00 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
1ff10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1ff20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
1ff30 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1ff40 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
1ff50 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
1ff60 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1ff70 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1ff80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ff90 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1ffa0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
1ffb0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
1ffc0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
1ffd0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
1ffe0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
1fff0 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
20000 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20010 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
20020 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
20030 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
20040 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
20050 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
20060 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
20070 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
20080 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
20090 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
200a0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
200b0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
200c0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
200d0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
200e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
200f0 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
20100 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
20110 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
20120 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
20130 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
20140 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
20150 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
20160 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
20170 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
20180 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
20190 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
201a0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
201b0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
201c0 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
201d0 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
201e0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
201f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20200 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
20210 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
20220 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
20230 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
20240 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
20250 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
20260 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
20270 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
20280 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
20290 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
202a0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
202c0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
202d0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
202e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20300 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
20310 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
20320 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
20330 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
20340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
20350 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
20360 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
20370 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
20380 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
20390 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
203a0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
203b0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
203c0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
203d0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
203e0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
203f0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
20400 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
20410 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
20440 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
20450 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
20460 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
20470 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
20480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
204b0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204e0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
204f0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
20500 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
20510 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
20520 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
20530 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
20540 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
20550 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
20560 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
20570 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
20580 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
20590 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
205a0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
205b0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
205c0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
205d0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
205e0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
205f0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
20600 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
20610 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
20620 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
20630 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
20640 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
20650 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
20660 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
20670 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
20680 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
20690 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
206a0 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
206b0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
206c0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
206d0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
206e0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
206f0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
20700 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
20710 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
20720 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
20730 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
20740 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
20750 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
20760 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
20770 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
20780 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
20790 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
207a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
207b0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
207c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
207d0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
207e0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
207f0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
20800 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
20810 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
20820 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
20830 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
20840 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
20850 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
20860 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
20870 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
20880 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
20890 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  de, WINSHM_UNLCK
208a0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
208b0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ASE, n);.    }el
208c0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
208d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
208e0 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65  .    /* Undo the
208f0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a   local locks */.
20900 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
20920 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
20930 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ask;.      p->sh
20940 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
20950 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
20960 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
20970 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
20980 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
20990 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
209a0 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
209b0 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
209c0 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
209d0 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
209e0 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
209f0 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
20a00 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
20a10 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
20a20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
20a30 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
20a40 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
20a50 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
20a60 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
20a70 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
20a80 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
20a90 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
20aa0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
20ab0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
20ac0 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
20ad0 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
20ae0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
20af0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
20b00 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20b10 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
20b20 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
20b30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
20b40 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
20b50 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
20b60 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
20b70 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
20b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20b90 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
20ba0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
20bb0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53         rc = winS
20bc0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
20bd0 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52 44  mNode, WINSHM_RD
20be0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
20bf0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
20c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20c10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20c30 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
20c40 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
20c50 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
20c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20c70 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
20c80 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
20c90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
20ca0 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
20cb0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
20cc0 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
20cd0 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
20ce0 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
20cf0 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
20d00 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
20d10 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
20d20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
20d30 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
20d40 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
20d50 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
20d60 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
20d70 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
20d80 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
20d90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
20da0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
20db0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20dc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
20dd0 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
20de0 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
20df0 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
20e00 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
20e10 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
20e20 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
20e30 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
20e40 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
20e50 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
20e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e70 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
20e80 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
20e90 2c 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20  , WINSHM_WRLCK, 
20ea0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
20eb0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  E, n);.      if(
20ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20ed0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20ee0 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ( (p->sharedMask
20ef0 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20   & mask)==0 );. 
20f00 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61         p->exclMa
20f10 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
20f20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
20f30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20f40 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
20f50 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
20f60 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25  ("SHM-LOCK pid=%
20f70 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65  lu, id=%d, share
20f80 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c  dMask=%03x, excl
20f90 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73  Mask=%03x, rc=%s
20fa0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20fb0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20fc0 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20  essId(), p->id, 
20fd0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
20fe0 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20  ->exclMask,.    
20ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
21000 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
21010 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21020 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
21030 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
21040 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
21050 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a   shared memory..
21060 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
21070 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
21080 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
21090 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
210a0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
210b0 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
210c0 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
210d0 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
210e0 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72   void winShmBarr
210f0 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
21100 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
21110 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
21120 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
21130 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
21140 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
21150 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65  fd);.  sqlite3Me
21160 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20  moryBarrier();  
21170 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66   /* compiler-def
21180 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72  ined memory barr
21190 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45  ier */.  winShmE
211a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20  nterMutex();    
211b0 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78     /* Also mutex
211c0 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79  , for redundancy
211d0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76   */.  winShmLeav
211e0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
211f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21200 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
21210 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
21220 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
21230 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61 72 65   of the.** share
21240 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  d-memory associa
21250 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
21260 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53  abase file fd. S
21270 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
21280 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ions.** are numb
21290 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
212a0 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
212b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
212c0 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a  on is szRegion.*
212d0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
212e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
212f0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
21300 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21310 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
21320 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
21330 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
21340 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72   the isWrite par
21350 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
21360 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
21370 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
21380 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
21390 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
213a0 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
213b0 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
213c0 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
213d0 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
213e0 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
213f0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
21400 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
21410 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e  .** isWrite is n
21420 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
21430 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
21440 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
21450 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65  as not yet.** be
21460 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
21470 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
21480 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
21490 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
214a0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
214b0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
214c0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
214d0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
214e0 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
214f0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
21500 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
21510 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
21520 63 65 73 73 65 73 0a 2a 2a 20 61 64 64 72 65 73  cesses.** addres
21530 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
21540 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
21550 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
21560 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
21570 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d.** memory and 
21580 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
21590 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
215a0 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73  t winShmMap(.  s
215b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215d0 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e  * Handle open on
215e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
215f0 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c  /.  int iRegion,
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21610 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f      /* Region to
21620 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69   retrieve */.  i
21630 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20  nt szRegion,    
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21650 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e  * Size of region
21660 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69  s */.  int isWri
21670 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
21680 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
21690 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66  o extend file if
216a0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
216b0 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a  void volatile **
216c0 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pp              
216d0 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d  /* OUT: Mapped m
216e0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69  emory */.){.  wi
216f0 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
21700 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77  winFile*)fd;.  w
21710 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20 70 44  inShm *pShm = pD
21720 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e  bFd->pShm;.  win
21730 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
21740 65 3b 0a 20 20 44 57 4f 52 44 20 70 72 6f 74 65  e;.  DWORD prote
21750 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
21760 49 54 45 3b 0a 20 20 44 57 4f 52 44 20 66 6c 61  ITE;.  DWORD fla
21770 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52  gs = FILE_MAP_WR
21780 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
21790 45 41 44 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  EAD;.  int rc = 
217a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
217b0 28 20 21 70 53 68 6d 20 29 7b 0a 20 20 20 20 72  ( !pShm ){.    r
217c0 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
217d0 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
217e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
217f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
21800 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20 70 44  c;.    pShm = pD
21810 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
21820 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d   pShmNode = pShm
21830 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
21840 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
21850 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
21860 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  ex);.  if( pShmN
21870 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20  ode->isUnlocked 
21880 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
21890 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  ockSharedMemory(
218a0 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29  pDbFd, pShmNode)
218b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
218c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
218d0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
218e0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
218f0 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  cked = 0;.  }.  
21900 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
21910 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
21920 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
21930 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
21940 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
21950 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
21960 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  n ){.    struct 
21970 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77  ShmRegion *apNew
21980 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
21990 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72  ew aRegion[] arr
219a0 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
219b0 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
219c0 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
219d0 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
219e0 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
219f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21a00 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
21a10 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
21a20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65  size of wal-inde
21a30 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70  x file */..    p
21a40 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
21a50 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
21a60 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
21a70 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
21a80 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
21a90 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
21aa0 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
21ab0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
21ac0 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
21ad0 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
21ae0 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
21af0 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c  file is.    ** l
21b00 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
21b10 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
21b20 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
21b30 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69    */.    rc = wi
21b40 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
21b50 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
21b60 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29  ode->hFile, &sz)
21b70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21b80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21b90 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
21ba0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
21bb0 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
21bc0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70   "winShmMap1", p
21bf0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
21c00 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
21c10 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
21c20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b   if( sz<nByte ){
21c30 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
21c40 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
21c50 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
21c60 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65  xist. If isWrite
21c70 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
21c80 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65   ** zero, exit e
21c90 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
21ca0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
21cb0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
21cc0 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rned..      **. 
21cd0 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74       ** Alternat
21ce0 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74  ively, if isWrit
21cf0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75  e is non-zero, u
21d00 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
21d10 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
21d20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
21d30 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
21d40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21d50 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67  if( !isWrite ) g
21d60 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
21d70 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
21d80 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
21d90 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
21da0 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29  e->hFile, nByte)
21db0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
21dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21dd0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
21de0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21df0 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
21e00 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
21e30 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p2", pDbFd->zPat
21e40 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  h);.        goto
21e50 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
21e60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21e70 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
21e80 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
21e90 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
21ea0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
21eb0 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
21ec0 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68  New = (struct Sh
21ed0 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65  mRegion *)sqlite
21ee0 33 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20  3_realloc64(.   
21ef0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
21f00 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
21f10 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77  +1)*sizeof(apNew
21f20 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  [0]).    );.    
21f30 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
21f40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21f50 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
21f60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
21f70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
21f80 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
21f90 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
21fa0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
21fb0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ->isReadonly ){.
21fc0 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20        protect = 
21fd0 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
21fe0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 46 49 4c       flags = FIL
21ff0 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 20 20 20 20  E_MAP_READ;.    
22000 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  }..    while( pS
22010 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
22020 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
22030 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20    HANDLE hMap = 
22040 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a  NULL;         /*
22050 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61   file-mapping ha
22060 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f  ndle */.      vo
22070 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20  id *pMap = 0;   
22080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70            /* Map
22090 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ped memory regio
220a0 6e 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  n */..#if SQLITE
220b0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
220c0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
220d0 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
220e0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  p(pShmNode->hFil
220f0 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
22100 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 42  ULL, protect, nB
22110 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
22120 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
22130 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
22140 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d  S_WIDE).      hM
22150 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
22160 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f  eMappingW(pShmNo
22170 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
22180 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f         NULL, pro
22190 74 65 63 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  tect, 0, nByte, 
221a0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
221b0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
221c0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
221d0 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  I) && SQLITE_WIN
221e0 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50  32_CREATEFILEMAP
221f0 50 49 4e 47 41 0a 20 20 20 20 20 20 68 4d 61 70  PINGA.      hMap
22200 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
22210 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65  appingA(pShmNode
22220 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
22230 20 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65       NULL, prote
22240 63 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  ct, 0, nByte, NU
22250 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
22260 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
22270 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
22280 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
22290 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
222a0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
222b0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
222c0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
222d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
222e0 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
222f0 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
22300 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
22310 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
22320 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
22330 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
22340 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
22350 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
22360 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
22370 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
22380 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
22390 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
223a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
223b0 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
223c0 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
223d0 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
223e0 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20   flags,.        
223f0 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f      iOffset - iO
22400 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
22410 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
22420 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
22430 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61  else.        pMa
22440 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
22450 69 6c 65 28 68 4d 61 70 2c 20 66 6c 61 67 73 2c  ile(hMap, flags,
22460 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
22470 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
22480 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
22490 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
224a0 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69          );.#endi
224b0 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  f.        OSTRAC
224c0 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20  E(("SHM-MAP-MAP 
224d0 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d  pid=%lu, region=
224e0 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
224f0 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ize=%d, rc=%s\n"
22500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22510 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
22520 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
22530 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
22540 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Offset,.        
22550 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f           szRegio
22560 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a  n, pMap ? "ok" :
22570 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
22580 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
22590 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
225a0 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
225b0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
225c0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
225d0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
225e0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
225f0 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  MMAP, pShmNode->
22600 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22      "winShmMap3"
22630 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
22640 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61  .        if( hMa
22650 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  p ) osCloseHandl
22660 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  e(hMap);.       
22670 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
22680 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
22690 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
226a0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
226b0 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d  egion].pMap = pM
226c0 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
226d0 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
226e0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68  Node->nRegion].h
226f0 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20  Map = hMap;.    
22700 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
22710 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ion++;.    }.  }
22720 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
22730 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
22740 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
22750 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  {.    int iOffse
22760 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65  t = iRegion*szRe
22770 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f  gion;.    int iO
22780 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
22790 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
227a0 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
227b0 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63  anularity;.    c
227c0 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a  har *p = (char *
227d0 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69  )pShmNode->aRegi
227e0 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  on[iRegion].pMap
227f0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69  ;.    *pp = (voi
22800 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68  d *)&p[iOffsetSh
22810 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ift];.  }else{. 
22820 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
22830 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
22840 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63  isReadonly && rc
22850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
22860 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
22870 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  LY;.  sqlite3_mu
22880 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
22890 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
228a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
228b0 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
228c0 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
228d0 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
228e0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
228f0 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
22900 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
22910 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
22920 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22930 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
22940 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20  * Cleans up the 
22950 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66  mapped region of
22960 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
22970 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ile, if any..*/.
22980 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
22990 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69  MAP_SIZE>0.stati
229a0 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69  c int winUnmapfi
229b0 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  le(winFile *pFil
229c0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  e){.  assert( pF
229d0 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52  ile!=0 );.  OSTR
229e0 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45  ACE(("UNMAP-FILE
229f0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
22a00 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61  %p, hMap=%p, pMa
22a10 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
22a20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69           "mmapSi
22a30 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a  ze=%lld, mmapSiz
22a40 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d  eActual=%lld, mm
22a50 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e  apSizeMax=%lld\n
22a60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
22a70 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
22a80 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
22a90 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65  ile->hMap, pFile
22aa0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20  ->pMapRegion,.  
22ab0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
22ac0 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d  mmapSize, pFile-
22ad0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c  >mmapSizeActual,
22ae0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
22af0 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69  Max));.  if( pFi
22b00 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  le->pMapRegion )
22b10 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d  {.    if( !osUnm
22b20 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
22b30 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20  le->pMapRegion) 
22b40 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
22b50 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
22b60 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
22b70 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e      OSTRACE(("UN
22b80 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
22b90 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70  , pFile=%p, pMap
22ba0 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20  Region=%p, ".   
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d              "rc=
22bc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
22bd0 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  P\n", osGetCurre
22be0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
22bf0 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
22c00 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70       pFile->pMap
22c10 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  Region));.      
22c20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
22c30 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22c40 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
22c50 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22   "winUnmapfile1"
22c80 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
22c90 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
22ca0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
22cb0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
22cc0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  pSize = 0;.    p
22cd0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
22ce0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tual = 0;.  }.  
22cf0 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21  if( pFile->hMap!
22d00 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  =NULL ){.    if(
22d10 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28   !osCloseHandle(
22d20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a  pFile->hMap) ){.
22d30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
22d40 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
22d50 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
22d60 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
22d70 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
22d80 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70  File=%p, hMap=%p
22d90 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
22da0 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20  R_MMAP\n",.     
22db0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
22dc0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
22dd0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
22de0 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72  >hMap));.      r
22df0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
22e00 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
22e10 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  MAP, pFile->last
22e20 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e40 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c  "winUnmapfile2",
22e50 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
22e60 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
22e70 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
22e80 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  }.  OSTRACE(("UN
22e90 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
22ea0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
22eb0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
22ec0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
22ed0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
22ee0 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75   pFile));.  retu
22ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22f00 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61  ./*.** Memory ma
22f10 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66  p or remap the f
22f20 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69  ile opened by fi
22f30 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46  le-descriptor pF
22f40 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a  d (if the file.*
22f50 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70  * is already map
22f60 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e  ped, the existin
22f70 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70  g mapping is rep
22f80 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77  laced by the new
22f90 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65  ). Or, if.** the
22fa0 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  re already exist
22fb0 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20  s a mapping for 
22fc0 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74  this file, and t
22fd0 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a  here are still.*
22fe0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46  * outstanding xF
22ff0 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65  etch() reference
23000 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75  s to it, this fu
23010 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
23020 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  p..**.** If para
23030 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e  meter nByte is n
23040 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65  on-negative, the
23050 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75  n it is the requ
23060 65 73 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a  ested size of.**
23070 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
23080 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
23090 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
230a0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
230b0 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  hen the.** reque
230c0 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65  sted size is the
230d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
230e0 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61  e on disk. The a
230f0 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
23100 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70  e.** created map
23110 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74  ping is either t
23120 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
23130 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63  e or the value c
23140 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69  onfigured.** usi
23150 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
23160 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68  MMAP_SIZE, which
23170 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
23180 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
23190 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
231a0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
231b0 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
231c0 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
231d0 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
231e0 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
231f0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
23200 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
23210 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
23220 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
23230 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77  int winMapfile(w
23240 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c  inFile *pFd, sql
23250 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
23260 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
23270 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b  64 nMap = nByte;
23280 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
23290 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c  sert( nMap>=0 ||
232a0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
232b0 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
232c0 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
232d0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69  lu, pFile=%p, si
232e0 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20  ze=%lld\n",.    
232f0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
23300 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
23310 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20  pFd, nByte));.. 
23320 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68   if( pFd->nFetch
23330 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53  Out>0 ) return S
23340 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
23350 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72   nMap<0 ){.    r
23360 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
23370 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
23380 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20  Fd, &nMap);.    
23390 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
233a0 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
233b0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
233c0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
233d0 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a  IOERR_FSTAT\n",.
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
233f0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
23400 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
23410 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23420 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
23430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
23440 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
23450 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
23460 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
23470 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70  eMax;.  }.  nMap
23480 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e   &= ~(sqlite3_in
23490 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e  t64)(winSysInfo.
234a0 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  dwPageSize - 1);
234b0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20  ..  if( nMap==0 
234c0 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  && pFd->mmapSize
234d0 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d  >0 ){.    winUnm
234e0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
234f0 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64  .  if( nMap!=pFd
23500 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
23510 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30    void *pNew = 0
23520 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74  ;.    DWORD prot
23530 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f  ect = PAGE_READO
23540 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66  NLY;.    DWORD f
23550 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f  lags = FILE_MAP_
23560 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e  READ;..    winUn
23570 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 23 69  mapfile(pFd);.#i
23580 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50  fdef SQLITE_MMAP
23590 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 69  _READWRITE.    i
235a0 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61  f( (pFd->ctrlFla
235b0 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f  gs & WINFILE_RDO
235c0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
235d0 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
235e0 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20  READWRITE;.     
235f0 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d   flags |= FILE_M
23600 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a  AP_WRITE;.    }.
23610 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
23620 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
23630 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65  Fd->hMap = osCre
23640 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
23650 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55  omApp(pFd->h, NU
23660 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61  LL, protect, nMa
23670 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  p, NULL);.#elif 
23680 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
23690 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
236a0 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
236b0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
236c0 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngW(pFd->h, NULL
236d0 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
23700 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
23710 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
23740 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
23750 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
23760 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
23770 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
23780 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57  NSI) && SQLITE_W
23790 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d  IN32_CREATEFILEM
237a0 41 50 50 49 4e 47 41 0a 20 20 20 20 70 46 64 2d  APPINGA.    pFd-
237b0 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
237c0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64  FileMappingA(pFd
237d0 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
237e0 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23800 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61      (DWORD)((nMa
23810 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66  p>>32) & 0xfffff
23820 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20  fff),.          
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23840 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d        (DWORD)(nM
23850 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29  ap & 0xffffffff)
23860 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
23870 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61      if( pFd->hMa
23880 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  p==NULL ){.     
23890 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20   pFd->lastErrno 
238a0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
238b0 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
238c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
238d0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
238e0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65       "winMapfile
23910 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  1", pFd->zPath);
23920 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68  .      /* Log th
23930 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e  e error, but con
23940 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65  tinue normal ope
23950 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65  ration using xRe
23960 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  ad/xWrite */.   
23970 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
23980 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64  -FILE-CREATE pid
23990 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
239a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
239b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
239c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
239d0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
239e0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
239f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23a00 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  _OK;.    }.    a
23a10 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77  ssert( (nMap % w
23a20 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
23a30 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Size)==0 );.    
23a40 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53  assert( sizeof(S
23a50 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73  IZE_T)==sizeof(s
23a60 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c  qlite3_int64) ||
23a70 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66   nMap<=0xfffffff
23a80 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  f );.#if SQLITE_
23a90 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65  OS_WINRT.    pNe
23aa0 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
23ab0 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ileFromApp(pFd->
23ac0 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
23ad0 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23  (SIZE_T)nMap);.#
23ae0 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
23af0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
23b00 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
23b10 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29  , 0, 0, (SIZE_T)
23b20 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nMap);.#endif.  
23b30 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
23b40 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73   ){.      osClos
23b50 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61  eHandle(pFd->hMa
23b60 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68  p);.      pFd->h
23b70 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Map = NULL;.    
23b80 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
23b90 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
23ba0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
23bb0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
23bc0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
23bd0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
23c00 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e2", pFd->zPath)
23c10 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
23c20 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
23c30 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
23c40 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
23c50 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
23c60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
23c70 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25  P-FILE-MAP pid=%
23c80 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
23c90 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
23ca0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
23cb0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
23cc0 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
23cd0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
23ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23cf0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64  K;.    }.    pFd
23d00 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
23d10 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  New;.    pFd->mm
23d20 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  apSize = nMap;. 
23d30 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
23d40 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20  Actual = nMap;. 
23d50 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
23d60 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
23d70 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
23d80 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
23d90 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
23da0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
23db0 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e   pFd));.  return
23dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
23dd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
23de0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
23df0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
23e00 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
23e10 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
23e20 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
23e30 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
23e40 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
23e50 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
23e60 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
23e70 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
23e80 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
23e90 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
23ea0 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
23eb0 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
23ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
23ed0 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
23ee0 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
23ef0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
23f00 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
23f10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
23f20 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
23f30 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
23f40 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
23f50 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
23f60 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
23f70 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
23f80 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
23f90 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
23fa0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
23fb0 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
23fc0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
23fd0 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65  entually.** rele
23fe0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
23ff0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e  e by calling win
24000 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74  Unfetch()..*/.st
24010 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63  atic int winFetc
24020 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
24030 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
24040 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
24050 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
24060 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
24070 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
24080 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
24090 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
240a0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
240b0 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20  */.#endif.  *pp 
240c0 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
240d0 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
240e0 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65   pFile=%p, offse
240f0 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25  t=%lld, amount=%
24100 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  d, pp=%p\n",.   
24110 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
24120 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
24130 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c   fd, iOff, nAmt,
24140 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49   pp));..#if SQLI
24150 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
24160 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  >0.  if( pFd->mm
24170 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20  apSizeMax>0 ){. 
24180 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70     if( pFd->pMap
24190 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Region==0 ){.   
241a0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d     int rc = winM
241b0 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
241c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
241d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
241e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 45      OSTRACE(("FE
241f0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
24200 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
24210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24220 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
24230 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
24240 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
24250 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
24260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
24270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
24280 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
24290 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
242a0 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
242b0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
242c0 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
242d0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
242e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
242f0 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  f..  OSTRACE(("F
24300 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
24310 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a  ile=%p, pp=%p, *
24320 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  pp=%p, rc=SQLITE
24330 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
24340 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
24350 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
24360 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74  pp, *pp));.  ret
24370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24380 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
24390 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
243a0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
243b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
243c0 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65  leases a.** refe
243d0 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62  rence obtained b
243e0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
243f0 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e  l to winFetch().
24400 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
24410 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
24420 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
24430 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
24440 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
24450 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
24460 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
24470 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63  d to the winFetc
24480 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  h() invocation..
24490 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
244a0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
244b0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
244c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
244d0 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74  eing called.** t
244e0 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53  o inform the VFS
244f0 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63   layer that, acc
24500 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c  ording to POSIX,
24510 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   any existing ma
24520 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77  pping.** may now
24530 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   be invalid and 
24540 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70  should be unmapp
24550 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24560 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c  t winUnfetch(sql
24570 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
24580 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70  64 iOff, void *p
24590 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
245a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
245b0 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  winFile *pFd = (
245c0 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f  winFile*)fd;   /
245d0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
245e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
245f0 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  /..  /* If p==0 
24600 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
24610 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
24620 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
24630 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78  tstanding.  ** x
24640 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
24650 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d  . Or, if p!=0 (m
24660 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20  eaning it is an 
24670 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
24680 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  ),.  ** then the
24690 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
246a0 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
246b0 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ing.  */.  asser
246c0 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d  t( (p==0)==(pFd-
246d0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29  >nFetchOut==0) )
246e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c  ;..  /* If p!=0,
246f0 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74   it must match t
24700 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a  he iOff value. *
24710 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  /.  assert( p==0
24720 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70   || p==&((u8 *)p
24730 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
24740 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52  iOff] );..  OSTR
24750 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
24760 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
24770 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d   offset=%lld, p=
24780 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
24790 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
247a0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
247b0 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66  iOff, p));..  if
247c0 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e  ( p ){.    pFd->
247d0 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d  nFetchOut--;.  }
247e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58  else{.    /* FIX
247f0 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20  ME:  If Windows 
24800 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65  truly always pre
24810 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67  vents truncating
24820 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20   or deleting a. 
24830 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65     ** file while
24840 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65   a mapping is he
24850 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  ld, then the fol
24860 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66  lowing winUnmapf
24870 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a  ile() call.    *
24880 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79  * is unnecessary
24890 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20   can be omitted 
248a0 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d  - potentially im
248b0 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70  proving.    ** p
248c0 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a  erformance.  */.
248d0 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
248e0 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (pFd);.  }..  as
248f0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
24900 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut>=0 );.#endi
24910 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  f..  OSTRACE(("U
24920 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  NFETCH pid=%lu, 
24930 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
24940 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
24950 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
24960 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
24970 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d));.  return SQ
24980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24990 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
249a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
249b0 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
249c0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
249d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
249e0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
249f0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
24a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
24a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
24a70 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
24a80 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
24a90 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
24aa0 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
24ab0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
24ac0 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
24ad0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24ae0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
24af0 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
24b00 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
24b30 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20    winClose,     
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
24b60 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20   winRead,       
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77   /* xRead */.  w
24b90 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  inWrite,        
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24bb0 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69  * xWrite */.  wi
24bc0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24be0 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
24bf0 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20  winSync,        
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69  /* xSync */.  wi
24c20 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  nFileSize,      
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c40 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
24c50 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  winLock,        
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  /* xLock */.  wi
24c80 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nUnlock,        
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ca0 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69   xUnlock */.  wi
24cb0 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
24cc0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
24cd0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
24ce0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ock */.  winFile
24cf0 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
24d00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
24d10 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69  eControl */.  wi
24d20 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  nSectorSize,    
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d40 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
24d50 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
24d60 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
24d70 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
24d80 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
24d90 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20   winShmMap,     
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
24dc0 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20   winShmLock,    
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
24df0 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
24e20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61   */.  winShmUnma
24e30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24e40 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
24e50 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68  ap */.  winFetch
24e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24e70 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
24e80 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63  h */.  winUnfetc
24e90 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
24ea0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74         /* xUnfet
24eb0 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ch */.};../*.** 
24ec0 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
24ed0 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
24ee0 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
24ef0 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
24f00 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
24f10 69 6e 33 32 20 77 69 74 68 6f 75 74 20 70 65 72  in32 without per
24f20 66 6f 72 6d 69 6e 67 20 61 6e 79 20 6c 6f 63 6b  forming any lock
24f30 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
24f40 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
24f50 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4e 6f 6c  methods winIoNol
24f60 6f 63 6b 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  ockMethod = {.  
24f70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f90 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
24fa0 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20   winClose,      
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fc0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
24fd0 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20  winRead,        
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69  /* xRead */.  wi
25000 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  nWrite,         
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25020 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e   xWrite */.  win
25030 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25050 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77  xTruncate */.  w
25060 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  inSync,         
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25080 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e  * xSync */.  win
25090 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
250b0 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77  xFileSize */.  w
250c0 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20  inNolockLock,   
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
250e0 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  * xLock */.  win
250f0 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  NolockUnlock,   
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25110 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  xUnlock */.  win
25120 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  NolockCheckReser
25130 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
25140 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
25150 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43  ck */.  winFileC
25160 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
25170 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
25180 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e  Control */.  win
25190 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
251b0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
251c0 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
251d0 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
251e0 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
251f0 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
25200 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  winShmMap,      
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
25230 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  winShmLock,     
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
25260 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20   winShmBarrier, 
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
25290 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70  */.  winShmUnmap
252a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
252b0 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
252c0 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c  p */.  winFetch,
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
252f0 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68   */.  winUnfetch
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25310 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
25320 68 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  h */.};..static 
25330 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 77 69  winVfsAppData wi
25340 6e 41 70 70 44 61 74 61 20 3d 20 7b 0a 20 20 26  nAppData = {.  &
25350 77 69 6e 49 6f 4d 65 74 68 6f 64 2c 20 20 20 20  winIoMethod,    
25360 20 20 20 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f     /* pMethod */
25370 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
25380 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
25390 74 61 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  ta */.  0       
253a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
253b0 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 73 74  NoLock */.};..st
253c0 61 74 69 63 20 77 69 6e 56 66 73 41 70 70 44 61  atic winVfsAppDa
253d0 74 61 20 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44  ta winNolockAppD
253e0 61 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e 49 6f  ata = {.  &winIo
253f0 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64 2c 20 2f 2a  NolockMethod, /*
25400 20 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c   pMethod */.  0,
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
25430 0a 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20  .  1            
25440 20 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63         /* bNoLoc
25450 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  k */.};../******
25460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
254b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254c0 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
254d0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
254e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
254f0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
25500 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
25510 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
25520 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
25530 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
25540 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
25550 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
25560 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20  CYGWIN__)./*.** 
25570 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61  Convert a filena
25580 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72  me from whatever
25590 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
255a0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
255b0 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72  .** supports for
255c0 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20   filenames into 
255d0 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
255e0 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
255f0 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
25600 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
25610 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
25620 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
25630 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
25640 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72   char *winConver
25650 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
25660 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
25670 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
25680 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
25690 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
256a0 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
256b0 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
256c0 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  tf8(zFilename);.
256d0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
256e0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
256f0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
25700 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 4d 62 63  nverted = winMbc
25710 73 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d  sToUtf8(zFilenam
25720 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  e, osAreFileApis
25730 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e  ANSI());.  }.#en
25740 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
25750 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
25760 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
25770 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
25780 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
25790 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
257a0 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
257b0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
257c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
257d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
257e0 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
257f0 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
25800 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
25810 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
25820 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
25830 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
25840 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
25850 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
25860 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65  c void *winConve
25870 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
25880 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
25890 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
258a0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
258b0 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  0;.  if( osIsNT(
258c0 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
258d0 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ted = winUtf8ToU
258e0 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
258f0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
25900 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
25910 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
25920 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
25930 55 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65  Utf8ToMbcs(zFile
25940 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65 41  name, osAreFileA
25950 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a  pisANSI());.  }.
25960 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
25970 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
25980 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
25990 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
259a0 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ted;.}../*.** Th
259b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
259c0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
259d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54  the specified UT
259e0 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65  F-8 string buffe
259f0 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61  r.** ends with a
25a00 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72   directory separ
25a10 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f  ator character o
25a20 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73  r one was succes
25a30 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20  sfully.** added 
25a40 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  to it..*/.static
25a50 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49   int winMakeEndI
25a60 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66  nDirSep(int nBuf
25a70 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
25a80 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20   if( zBuf ){.   
25a90 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69   int nLen = sqli
25aa0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
25ab0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e  );.    if( nLen>
25ac0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  0 ){.      if( w
25ad0 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b  inIsDirSep(zBuf[
25ae0 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20  nLen-1]) ){.    
25af0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
25b00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c      }else if( nL
25b10 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20  en+1<nBuf ){.   
25b20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20       zBuf[nLen] 
25b30 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  = winGetDirSep()
25b40 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e  ;.        zBuf[n
25b50 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Len+1] = '\0';. 
25b60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
25b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
25b90 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
25ba0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
25bb0 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74  name and store t
25bc0 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69  he resulting poi
25bd0 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e  nter into pzBuf.
25be0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
25bf0 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75  returned in pzBu
25c00 66 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  f must be freed 
25c10 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65  via sqlite3_free
25c20 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
25c30 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  t winGetTempname
25c40 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
25c50 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66  fs, char **pzBuf
25c60 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
25c70 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
25c80 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
25c90 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
25ca0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
25cb0 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
25cc0 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
25cd0 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20    size_t i, j;. 
25ce0 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69   int nPre = sqli
25cf0 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49  te3Strlen30(SQLI
25d00 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
25d10 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  FIX);.  int nMax
25d20 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c  , nBuf, nDir, nL
25d30 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  en;.  char *zBuf
25d40 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
25d50 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
25d60 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
25d70 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
25d80 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
25d90 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
25da0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
25db0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
25dc0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
25dd0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
25de0 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  ling..  */.  Sim
25df0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
25e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25e10 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  R );..  /* Alloc
25e20 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
25e30 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
25e40 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
25e50 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61  ied file.  ** na
25e60 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  me for the tempo
25e70 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74  rary file.  If t
25e80 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61  his fails, we ca
25e90 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20  nnot continue.. 
25ea0 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66   */.  nMax = pVf
25eb0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e  s->mxPathname; n
25ec0 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a  Buf = nMax + 2;.
25ed0 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33    zBuf = sqlite3
25ee0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66  MallocZero( nBuf
25ef0 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20   );.  if( !zBuf 
25f00 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
25f10 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
25f20 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
25f30 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72  OMEM\n"));.    r
25f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25f50 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
25f60 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
25f70 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76  out the effectiv
25f80 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
25f90 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63  ctory.  First, c
25fa0 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  heck if one.  **
25fb0 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63   has been explic
25fc0 69 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20  itly set by the 
25fd0 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68  application; oth
25fe0 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20  erwise, use the 
25ff0 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  one.  ** configu
26000 72 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61  red by the opera
26010 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a  ting system..  *
26020 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20  /.  nDir = nMax 
26030 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20  - (nPre + 15);. 
26040 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20   assert( nDir>0 
26050 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
26060 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
26070 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c  ){.    int nDirL
26080 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
26090 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d  en30(sqlite3_tem
260a0 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
260b0 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20    if( nDirLen>0 
260c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 77 69  ){.      if( !wi
260d0 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69 74 65  nIsDirSep(sqlite
260e0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
260f0 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a  [nDirLen-1]) ){.
26100 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b          nDirLen+
26110 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
26120 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69   if( nDirLen>nDi
26130 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
26140 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
26150 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
26160 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
26170 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
26180 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72  \n"));.        r
26190 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
261a0 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
261b0 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
261c0 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  me1", 0);.      
261d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
261e0 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
261f0 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  Buf, "%s", sqlit
26200 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
26210 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  y);.    }.  }.#i
26220 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
26230 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20  IN__).  else{.  
26240 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
26250 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
26260 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  {.       0, /* g
26270 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
26280 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
26290 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
262a0 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20  MPDIR") */.     
262b0 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
262c0 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  TMP") */.       
262d0 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45  0, /* getenv("TE
262e0 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
262f0 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45  , /* getenv("USE
26300 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20  RPROFILE") */.  
26310 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
26320 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  .       "/usr/tm
26330 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70  p",.       "/tmp
26340 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20  ",.       ".",. 
26350 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f        0        /
26360 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
26370 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  r */.    };.    
26380 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
26390 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
263a0 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69  zDir = 0;..    i
263b0 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20  f( !azDirs[0] ) 
263c0 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65  azDirs[0] = gete
263d0 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
263e0 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  R");.    if( !az
263f0 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
26400 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
26410 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
26420 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44  !azDirs[2] ) azD
26430 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28  irs[2] = getenv(
26440 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  "TMP");.    if( 
26450 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44  !azDirs[3] ) azD
26460 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28  irs[3] = getenv(
26470 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28  "TEMP");.    if(
26480 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a   !azDirs[4] ) az
26490 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76  Dirs[4] = getenv
264a0 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
264b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
264c0 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
264d0 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
264e0 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b  ; zDir=azDirs[i+
264f0 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  +]){.      void 
26500 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20  *zConverted;.   
26510 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29     if( zDir==0 )
26520 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
26530 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   /* If the path 
26540 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
26550 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f  ive letter follo
26560 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e  wed by the colon
26570 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63  .      ** charac
26580 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69  ter, assume it i
26590 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69  s already a nati
265a0 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f  ve Win32 path; o
265b0 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
265c0 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f  ** it must be co
265d0 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74  nverted to a nat
265e0 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 76  ive Win32 path v
265f0 69 61 20 74 68 65 20 43 79 67 77 69 6e 20 41 50  ia the Cygwin AP
26600 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72  I.      ** prior
26610 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20   to using it..  
26620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
26630 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
26640 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20  rAndColon(zDir) 
26650 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76  ){.        zConv
26660 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
26670 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
26680 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  me(zDir);.      
26690 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65    if( !zConverte
266a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
266b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
266c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
266d0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
266e0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
266f0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
26700 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
26710 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
26720 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
26730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26740 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
26750 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
26760 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
26770 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
26780 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  "%s", zDir);.   
26790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
267a0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
267b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
267c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
267d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
267e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
267f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26800 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
26810 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26820 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20  o( nMax+1 );.   
26830 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65       if( !zConve
26840 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rted ){.        
26850 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26860 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
26870 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
26880 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
26890 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
268a0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
268b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
268c0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
268d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
268e0 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
268f0 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
26900 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f        osIsNT() ?
26910 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
26920 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
26930 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a  TO_WIN_A, zDir,.
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26950 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78  zConverted, nMax
26960 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  +1)<0 ){.       
26970 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26980 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
26990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
269a0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
269b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
269c0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
269d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
269e0 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  VPATH\n"));.    
269f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
26a00 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
26a10 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20  IOERR_CONVPATH, 
26a20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
26a50 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44  etTempname2", zD
26a60 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ir);.        }. 
26a70 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73         if( winIs
26a80 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
26a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
26aa0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
26ab0 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69  e know the candi
26ac0 64 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65  date directory e
26ad0 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64  xists and should
26ae0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
26af0 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c   used.  However,
26b00 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   we may need to 
26b10 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69  convert the stri
26b20 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  ng containing.  
26b30 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e          ** its n
26b40 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28  ame into UTF-8 (
26b50 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54  i.e. if it is UT
26b60 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e  F-16 right now).
26b70 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
26b80 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55          char *zU
26b90 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
26ba0 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
26bb0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
26bc0 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38        if( !zUtf8
26bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26be0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26bf0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
26c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26c10 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
26c20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
26c30 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
26c40 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
26c50 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
26c60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26c70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
26c80 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
26c90 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
26ca0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
26cb0 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
26cc0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20  Utf8);.         
26cd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
26ce0 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tf8);.          
26cf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26d00 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
26d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
26d30 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
26d40 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rted);.      }. 
26d50 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21     }.  }.#elif !
26d60 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
26d70 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
26d80 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69  GWIN__).  else i
26d90 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
26da0 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b     char *zMulti;
26db0 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64  .    LPWSTR zWid
26dc0 65 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d  ePath = sqlite3M
26dd0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a  allocZero( nMax*
26de0 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b  sizeof(WCHAR) );
26df0 0a 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50  .    if( !zWideP
26e00 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
26e10 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
26e20 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
26e30 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
26e40 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26e50 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
26e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
26e70 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
26e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
26e90 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d  sGetTempPathW(nM
26ea0 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d  ax, zWidePath)==
26eb0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26ec0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
26ed0 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
26ee0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
26ef0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
26f00 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
26f10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
26f20 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
26f30 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
26f40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
26f50 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c  ERR_GETTEMPPATH,
26f60 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
26f70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
26f80 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
26f90 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30  GetTempname2", 0
26fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75  );.    }.    zMu
26fb0 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  lti = winUnicode
26fc0 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
26fd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
26fe0 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
26ff0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
27000 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d  , zBuf, "%s", zM
27010 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
27020 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69  ite3_free(zMulti
27030 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27040 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29  _free(zWidePath)
27050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27060 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27070 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
27080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27090 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
270a0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
270b0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
270c0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
270d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
270e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
270f0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
27100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
27110 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
27120 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
27130 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a  Utf8;.    char *
27140 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69  zMbcsPath = sqli
27150 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
27160 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21  Max );.    if( !
27170 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20  zMbcsPath ){.   
27180 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27190 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
271a0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
271b0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
271c0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
271d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
271e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
271f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
27200 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61   if( osGetTempPa
27210 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50  thA(nMax, zMbcsP
27220 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ath)==0 ){.     
27230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
27240 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
27250 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
27260 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
27270 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e  RR_GETTEMPPATH\n
27280 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
27290 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
272a0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
272b0 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  MPPATH, osGetLas
272c0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
272f0 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  me3", 0);.    }.
27300 20 20 20 20 7a 55 74 66 38 20 3d 20 77 69 6e 4d      zUtf8 = winM
27310 62 63 73 54 6f 55 74 66 38 28 7a 4d 62 63 73 50  bcsToUtf8(zMbcsP
27320 61 74 68 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  ath, osAreFileAp
27330 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 69  isANSI());.    i
27340 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
27350 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
27360 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
27370 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
27380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27390 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
273a0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
273b0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
273c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
273d0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
273e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
273f0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
27400 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27410 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
27420 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
27430 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
27440 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66  S_ANSI */.#endif
27450 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   /* !SQLITE_OS_W
27460 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  INRT */..  /*.  
27470 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
27480 20 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72   sure the tempor
27490 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e  ary directory en
274a0 64 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f  ds with an appro
274b0 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61  priate.  ** sepa
274c0 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f  rator.  If it do
274d0 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65  es not and there
274e0 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73   is not enough s
274f0 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64  pace left to add
27500 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e  .  ** one, fail.
27510 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e  .  */.  if( !win
27520 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
27530 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b  nDir+1, zBuf) ){
27540 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27550 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
27560 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
27570 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
27580 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
27590 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
275a0 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
275b0 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
275c0 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me4", 0);.  }.. 
275d0 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74   /*.  ** Check t
275e0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
275f0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
27600 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
27610 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a  mporary file.  *
27620 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f  * name in the fo
27630 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a  llowing format:.
27640 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65    **.  **   "<te
27650 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
27660 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58  y>/etilqs_XXXXXX
27670 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20  XXXXXXXXX\0\0". 
27680 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c   **.  ** If not,
27690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
276a0 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65  RROR.  The numbe
276b0 72 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72  r 17 is used her
276c0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  e in order to.  
276d0 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  ** account for t
276e0 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
276f0 20 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65   the 15 characte
27700 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20  r random suffix 
27710 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  and the.  ** two
27720 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68   trailing NUL ch
27730 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66  aracters.  The f
27740 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73  inal directory s
27750 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
27760 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  er.  ** has alre
27770 61 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20  ady added if it 
27780 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  was not already 
27790 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  present..  */.  
277a0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
277b0 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
277c0 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65  if( (nLen + nPre
277d0 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b   + 17) > nBuf ){
277e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
277f0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
27800 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
27810 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
27820 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
27830 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
27840 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
27850 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
27860 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me5", 0);.  }.. 
27870 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
27880 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20  f(nBuf-16-nLen, 
27890 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54  zBuf+nLen, SQLIT
278a0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
278b0 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69  IX);..  j = sqli
278c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
278d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
278e0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
278f0 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
27900 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
27910 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
27920 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
27930 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
27940 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
27950 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
27960 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
27970 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
27980 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75  ;.  *pzBuf = zBu
27990 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  f;..  OSTRACE(("
279a0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61  TEMP-FILENAME na
279b0 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
279c0 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a  _OK\n", zBuf));.
279d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
279e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
279f0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
27a00 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
27a10 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
27a20 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
27a30 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
27a40 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
27a50 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
27a60 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
27a70 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
27a80 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
27a90 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
27aa0 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
27ab0 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
27ac0 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
27ad0 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
27ae0 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
27af0 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49  rrno;..  if( osI
27b00 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
27b10 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
27b20 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
27b30 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
27b40 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
27b50 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
27b60 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
27b70 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
27b80 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
27b90 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
27ba0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bc0 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
27bd0 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
27be0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c00 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
27c10 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
27c20 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
27c30 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20  ){}.    if( !rc 
27c40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27c50 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61  0; /* Invalid na
27c60 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  me? */.    }.   
27c70 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
27c80 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
27c90 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  es;.#if SQLITE_O
27ca0 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
27cb0 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
27cc0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
27cd0 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
27ce0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
27cf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74   }.  return (att
27d00 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
27d10 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
27d20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
27d30 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a  UTE_DIRECTORY);.
27d40 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  }../* forward re
27d50 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
27d60 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
27d70 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
27d80 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
27d90 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
27da0 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
27db0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
27dc0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
27dd0 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
27de0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
27df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e00 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
27e10 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
27e20 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
27e30 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
27e40 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
27e50 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  */.);../*.** Ope
27e60 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  n a file..*/.sta
27e70 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
27e80 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
27e90 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVfs,        /* 
27ea0 55 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69  Used to get maxi
27eb0 6d 75 6d 20 70 61 74 68 20 6c 65 6e 67 74 68 20  mum path length 
27ec0 61 6e 64 20 41 70 70 44 61 74 61 20 2a 2f 0a 20  and AppData */. 
27ed0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
27ee0 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
27ef0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
27f00 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
27f10 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
27f20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
27f30 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68  he SQLite file h
27f40 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
27f50 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
27f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
27f70 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  n mode flags */.
27f80 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
27f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27fa0 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
27fb0 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c  gs */.){.  HANDL
27fc0 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  E h;.  DWORD las
27fd0 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57  tErrno = 0;.  DW
27fe0 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63  ORD dwDesiredAcc
27ff0 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53  ess;.  DWORD dwS
28000 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52  hareMode;.  DWOR
28010 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70  D dwCreationDisp
28020 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  osition;.  DWORD
28030 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
28040 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53  butes = 0;.#if S
28050 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
28060 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b   int isTemp = 0;
28070 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 56 66 73  .#endif.  winVfs
28080 41 70 70 44 61 74 61 20 2a 70 41 70 70 44 61 74  AppData *pAppDat
28090 61 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  a;.  winFile *pF
280a0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
280b0 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  id;.  void *zCon
280c0 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  verted;         
280d0 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
280e0 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20   in OS encoding 
280f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28100 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61  *zUtf8Name = zNa
28110 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  me; /* Filename 
28120 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e  in UTF-8 encodin
28130 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d  g */.  int cnt =
28140 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   0;..  /* If arg
28150 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
28160 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
28170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28180 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
28190 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
281a0 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
281b0 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
281c0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
281d0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a  n..  */.  char *
281e0 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a  zTmpname = 0; /*
281f0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
28200 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65  ilename, if nece
28210 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74  ssary. */..  int
28220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28240 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
28250 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ode */.#if !defi
28260 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53  ned(NDEBUG) || S
28270 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
28280 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
28290 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
282a0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
282b0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  to open */.#endi
282c0 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  f..  int isExclu
282d0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
282e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
282f0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
28300 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
28310 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
28320 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
28330 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
28340 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
28350 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
28360 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
28370 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
28380 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
28390 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
283a0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
283b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
283c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
283d0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
283e0 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75  .  int isOpenJou
283f0 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65  rnal = (isCreate
28400 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
28410 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
28420 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a  _MASTER_JOURNAL.
28430 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
28440 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
28450 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20  JOURNAL.     || 
28460 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28470 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e  EN_WAL.  ));.#en
28480 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
28490 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70  "OPEN name=%s, p
284a0 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25  File=%p, flags=%
284b0 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c  x, pOutFlags=%p\
284c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
284d0 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c  Utf8Name, id, fl
284e0 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 29  ags, pOutFlags))
284f0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
28500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
28510 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
28520 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
28530 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
28540 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
28550 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
28560 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
28570 64 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20  d.  **   (b) if 
28580 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
28590 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
285a0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
285b0 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
285c0 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
285d0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
285e0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
285f0 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
28600 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
28610 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
28620 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
28630 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
28640 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
28650 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
28660 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
28670 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
28680 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
28690 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
286a0 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
286b0 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
286c0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
286d0 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
286e0 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
286f0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
28700 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
28710 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
28720 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
28730 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20   are never.  ** 
28740 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
28750 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
28760 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
28770 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
28780 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
28790 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
287a0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
287b0 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
287c0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
287d0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
287e0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
287f0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
28800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
28810 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
28820 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
28830 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
28840 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
28850 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
28860 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
28870 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
28880 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
28890 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
288a0 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
288b0 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
288c0 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
288d0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
288e0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
288f0 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
28900 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
28910 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20 20 20 20  _TEMP_DB.       
28920 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
28930 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
28940 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
28950 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
28960 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20  URNAL.       || 
28970 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28980 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
28990 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
289a0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
289b0 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65  RNAL.       || e
289c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
289d0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
289e0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
289f0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
28a00 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
28a10 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  0 );.  memset(pF
28a20 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ile, 0, sizeof(w
28a30 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c  inFile));.  pFil
28a40 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
28a50 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69  ANDLE_VALUE;..#i
28a60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
28a70 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  T.  if( !zUtf8Na
28a80 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74  me && !sqlite3_t
28a90 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
28aa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
28ab0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20  (SQLITE_ERROR,. 
28ac0 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f         "sqlite3_
28ad0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76  temp_directory v
28ae0 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  ariable should b
28af0 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22  e set for WinRT"
28b00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
28b10 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
28b20 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
28b30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
28b40 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 0a  ULL, generate a.
28b50 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
28b60 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 0a  ile name to use.
28b70 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66    */.  if( !zUtf
28b80 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  8Name ){.    ass
28b90 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26 26  ert( isDelete &&
28ba0 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20   !isOpenJournal 
28bb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 47  );.    rc = winG
28bc0 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c  etTempname(pVfs,
28bd0 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20   &zTmpname);.   
28be0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28bf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  OK ){.      OSTR
28c00 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
28c10 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74 66  %s, rc=%s", zUtf
28c20 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  8Name, sqlite3Er
28c30 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
28c40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28c50 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
28c60 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
28c70 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65  }..  /* Database
28c80 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
28c90 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
28ca0 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
28cb0 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20  e not.  ** URIs 
28cc0 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
28cd0 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
28ce0 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
28cf0 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
28d00 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
28d10 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
28d20 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c  ert( (eType!=SQL
28d30 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
28d40 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  ) || (flags & SQ
28d50 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
28d60 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61  |.       zUtf8Na
28d70 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
28d80 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d  30(zUtf8Name)+1]
28d90 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  ==0 );..  /* Con
28da0 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
28db0 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
28dc0 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
28dd0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
28de0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
28df0 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65  lename(zUtf8Name
28e00 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
28e10 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ted==0 ){.    sq
28e20 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
28e30 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
28e40 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
28e50 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
28e60 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e  R_NOMEM", zUtf8N
28e70 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
28e80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28e90 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
28ea0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
28eb0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
28ec0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28ed0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28ee0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
28ef0 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
28f00 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
28f10 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41  %s, rc=SQLITE_CA
28f20 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a  NTOPEN_ISDIR", z
28f30 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20  Utf8Name));.    
28f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
28f50 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20  NTOPEN_ISDIR;.  
28f60 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  }..  if( isReadW
28f70 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65  rite ){.    dwDe
28f80 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
28f90 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
28fa0 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65  ERIC_WRITE;.  }e
28fb0 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72  lse{.    dwDesir
28fc0 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
28fd0 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  IC_READ;.  }..  
28fe0 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  /* SQLITE_OPEN_E
28ff0 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64  XCLUSIVE is used
29000 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
29010 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73  at a new file is
29020 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53  .  ** created. S
29030 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73  QLite doesn't us
29040 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65  e it to indicate
29050 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65   "exclusive acce
29060 73 73 22 0a 20 20 2a 2a 20 61 73 20 69 74 20 69  ss".  ** as it i
29070 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73  s usually unders
29080 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tood..  */.  if(
29090 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a   isExclusive ){.
290a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
290b0 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
290c0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
290d0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
290e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
290f0 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
29100 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
29110 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
29120 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
29130 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43  .  }else if( isC
29140 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20  reate ){.    /* 
29150 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69  Open existing fi
29160 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66  le, or create if
29170 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73   it doesn't exis
29180 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  t */.    dwCreat
29190 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
291a0 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
291b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70  }else{.    /* Op
291c0 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79  ens a file, only
291d0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a   if it exists. *
291e0 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
291f0 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
29200 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d  EN_EXISTING;.  }
29210 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20  ..  dwShareMode 
29220 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41  = FILE_SHARE_REA
29230 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57  D | FILE_SHARE_W
29240 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44  RITE;..  if( isD
29250 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c  elete ){.#if SQL
29260 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
29270 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
29280 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
29290 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20  RIBUTE_HIDDEN;. 
292a0 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23     isTemp = 1;.#
292b0 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73  else.    dwFlags
292c0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
292d0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54  FILE_ATTRIBUTE_T
292e0 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20  EMPORARY.       
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41          | FILE_A
29310 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a  TTRIBUTE_HIDDEN.
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
29340 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
29350 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64  E_ON_CLOSE;.#end
29360 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
29370 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
29380 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
29390 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  IBUTE_NORMAL;.  
293a0 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66  }.  /* Reports f
293b0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74  rom the internet
293c0 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72   are that perfor
293d0 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a  mance is always.
293e0 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46    ** better if F
293f0 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
29400 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20  ACCESS is used. 
29410 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a   Ticket #2699. *
29420 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
29430 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41  WINCE.  dwFlagsA
29440 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20  ndAttributes |= 
29450 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
29460 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a  _ACCESS;.#endif.
29470 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
29480 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
29490 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54  _WINRT.    CREAT
294a0 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
294b0 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e  PARAMETERS exten
294c0 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20  dedParameters;. 
294d0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
294e0 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73  eters.dwSize = s
294f0 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45  izeof(CREATEFILE
29500 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
29510 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65  ETERS);.    exte
29520 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
29530 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20  wFileAttributes 
29540 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77  =.            dw
29550 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
29560 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  es & FILE_ATTRIB
29570 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  UTE_MASK;.    ex
29580 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
29590 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64  .dwFileFlags = d
295a0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
295b0 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f  tes & FILE_FLAG_
295c0 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
295d0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
295e0 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20  ecurityQosFlags 
295f0 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59  = SECURITY_ANONY
29600 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64  MOUS;.    extend
29610 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53  edParameters.lpS
29620 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65  ecurityAttribute
29630 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78  s = NULL;.    ex
29640 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
29650 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d  .hTemplateFile =
29660 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 6f 7b 0a 20   NULL;.    do{. 
29670 20 20 20 20 20 68 20 3d 20 6f 73 43 72 65 61 74       h = osCreat
29680 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29  eFile2((LPCWSTR)
29690 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
296a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296b0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
296c0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
296e0 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
29710 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
29720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29730 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65   &extendedParame
29740 74 65 72 73 29 3b 0a 20 20 20 20 20 20 69 66 28  ters);.      if(
29750 20 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h!=INVALID_HAND
29760 4c 45 5f 56 41 4c 55 45 20 29 20 62 72 65 61 6b  LE_VALUE ) break
29770 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  ;.      if( isRe
29780 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
29790 20 20 20 69 6e 74 20 69 73 52 4f 20 3d 20 30 3b     int isRO = 0;
297a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 32  .        int rc2
297b0 20 3d 20 77 69 6e 41 63 63 65 73 73 28 70 56 66   = winAccess(pVf
297c0 73 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  s, zName, SQLITE
297d0 5f 41 43 43 45 53 53 5f 52 45 41 44 2c 20 26 69  _ACCESS_READ, &i
297e0 73 52 4f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sRO);.        if
297f0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
29800 20 26 26 20 69 73 52 4f 20 29 20 62 72 65 61 6b   && isRO ) break
29810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  ;.      }.    }w
29820 68 69 6c 65 28 20 77 69 6e 52 65 74 72 79 49 6f  hile( winRetryIo
29830 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
29840 72 72 6e 6f 29 20 29 3b 0a 23 65 6c 73 65 0a 20  rrno) );.#else. 
29850 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 68 20 3d     do{.      h =
29860 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28   osCreateFileW((
29870 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
29880 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
29890 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
298a0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
298b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298c0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
298d0 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
29900 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
29920 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
29930 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
29940 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
29950 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 21  L);.      if( h!
29960 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
29970 56 41 4c 55 45 20 29 20 62 72 65 61 6b 3b 0a 20  VALUE ) break;. 
29980 20 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57       if( isReadW
29990 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rite ){.        
299a0 69 6e 74 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20  int isRO = 0;.  
299b0 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
299c0 77 69 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20  winAccess(pVfs, 
299d0 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43  zName, SQLITE_AC
299e0 43 45 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f  CESS_READ, &isRO
299f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29a00 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  c2==SQLITE_OK &&
29a10 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20   isRO ) break;. 
29a20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
29a30 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  e( winRetryIoerr
29a40 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
29a50 6f 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  o) );.#endif.  }
29a60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
29a70 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
29a80 65 6c 73 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20  else{.    do{.  
29a90 20 20 20 20 68 20 3d 20 6f 73 43 72 65 61 74 65      h = osCreate
29aa0 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43  FileA((LPCSTR)zC
29ab0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
29ae0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
29af0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
29b00 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
29b30 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b50 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
29b60 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20     NULL);.      
29b90 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44 5f 48  if( h!=INVALID_H
29ba0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20 62 72  ANDLE_VALUE ) br
29bb0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  eak;.      if( i
29bc0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
29bd0 20 20 20 20 20 20 69 6e 74 20 69 73 52 4f 20 3d        int isRO =
29be0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
29bf0 72 63 32 20 3d 20 77 69 6e 41 63 63 65 73 73 28  rc2 = winAccess(
29c00 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  pVfs, zName, SQL
29c10 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 2c  ITE_ACCESS_READ,
29c20 20 26 69 73 52 4f 29 3b 0a 20 20 20 20 20 20 20   &isRO);.       
29c30 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
29c40 5f 4f 4b 20 26 26 20 69 73 52 4f 20 29 20 62 72  _OK && isRO ) br
29c50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29c60 20 7d 77 68 69 6c 65 28 20 77 69 6e 52 65 74 72   }while( winRetr
29c70 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
29c80 73 74 45 72 72 6e 6f 29 20 29 3b 0a 20 20 7d 0a  stErrno) );.  }.
29c90 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49  #endif.  winLogI
29ca0 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45  oerr(cnt, __LINE
29cb0 5f 5f 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  __);..  OSTRACE(
29cc0 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
29cd0 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
29ce0 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68  %lx, rc=%s\n", h
29cf0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20  , zUtf8Name,.   
29d00 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
29d10 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56  dAccess, (h==INV
29d20 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
29d30 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  E) ? "failed" : 
29d40 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68  "ok"));..  if( h
29d50 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
29d60 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 73 71  _VALUE ){.    sq
29d70 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
29d80 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
29d90 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
29da0 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65  e);.    if( isRe
29db0 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
29dc0 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
29dd0 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28   return winOpen(
29de0 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c  pVfs, zName, id,
29df0 0a 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67  .         ((flag
29e00 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
29e10 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20  ADONLY) &.      
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
29e30 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
29e40 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
29e50 52 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20  READWRITE)),.   
29e60 20 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29        pOutFlags)
29e70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29e80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
29e90 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
29ea0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
29eb0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
29ec0 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EN, pFile->lastE
29ed0 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c  rrno, "winOpen",
29ee0 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20   zUtf8Name);.   
29ef0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29f00 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
29f10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
29f20 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
29f30 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
29f40 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  e ){.      *pOut
29f50 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
29f60 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
29f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29f80 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
29f90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
29fa0 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
29fb0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66  OSTRACE(("OPEN f
29fc0 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c  ile=%p, name=%s,
29fd0 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75   access=%lx, pOu
29fe0 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74  tFlags=%p, *pOut
29ff0 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20  Flags=%d, ".    
2a000 20 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22         "rc=%s\n"
2a010 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  , h, zUtf8Name, 
2a020 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
2a030 20 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74   pOutFlags, pOut
2a040 46 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20  Flags ?.        
2a050 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20     *pOutFlags : 
2a060 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  0, (h==INVALID_H
2a070 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
2a080 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
2a090 3b 0a 0a 20 20 70 41 70 70 44 61 74 61 20 3d 20  ;..  pAppData = 
2a0a0 28 77 69 6e 56 66 73 41 70 70 44 61 74 61 2a 29  (winVfsAppData*)
2a0b0 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a  pVfs->pAppData;.
2a0c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2a0d0 49 4e 43 45 0a 20 20 7b 0a 20 20 20 20 69 66 28  INCE.  {.    if(
2a0e0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
2a0f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2a100 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
2a110 20 20 20 20 26 26 20 28 28 70 41 70 70 44 61 74      && ((pAppDat
2a120 61 3d 3d 4e 55 4c 4c 29 20 7c 7c 20 21 70 41 70  a==NULL) || !pAp
2a130 70 44 61 74 61 2d 3e 62 4e 6f 4c 6f 63 6b 29 0a  pData->bNoLock).
2a140 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20           && (rc 
2a150 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  = winceCreateLoc
2a160 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29  k(zName, pFile))
2a170 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  !=SQLITE_OK.    
2a180 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  ){.      osClose
2a190 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 20  Handle(h);.     
2a1a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2a1b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2a1c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
2a1d0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f  mpname);.      O
2a1e0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45  STRACE(("OPEN-CE
2a1f0 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72  -LOCK name=%s, r
2a200 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20  c=%s\n", zName, 
2a210 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
2a220 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
2a230 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2a240 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
2a250 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
2a260 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
2a270 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
2a280 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
2a290 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2a2a0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20  nverted);.  }.. 
2a2b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
2a2c0 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  mpname);.  pFile
2a2d0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 41 70 70  ->pMethod = pApp
2a2e0 44 61 74 61 20 3f 20 70 41 70 70 44 61 74 61 2d  Data ? pAppData-
2a2f0 3e 70 4d 65 74 68 6f 64 20 3a 20 26 77 69 6e 49  >pMethod : &winI
2a300 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
2a310 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2a320 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
2a330 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
2a340 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
2a350 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
2a360 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  LE_RDONLY;.  }. 
2a370 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
2a380 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
2a390 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
2a3a0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2a3b0 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
2a3c0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
2a3d0 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
2a3e0 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
2a3f0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
2a400 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
2a410 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49   zName;.#if SQLI
2a420 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2a430 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  >0.  pFile->hMap
2a440 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65   = NULL;.  pFile
2a450 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
2a460 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
2a470 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ize = 0;.  pFile
2a480 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
2a490 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
2a4a0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c  mapSizeMax = sql
2a4b0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2a4c0 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a  .szMmap;.#endif.
2a4d0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
2a4e0 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  1);.  return rc;
2a4f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2a500 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e   the named file.
2a510 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2a520 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f   Windows does no
2a530 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74  t allow a file t
2a540 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20  o be deleted if 
2a550 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
2a560 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65  ocess has it ope
2a570 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20  n.  Sometimes a 
2a580 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72  virus scanner or
2a590 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61   indexing progra
2a5a0 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61  m.** will open a
2a5b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68   journal file sh
2a5c0 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69  ortly after it i
2a5d0 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64  s created in ord
2a5e0 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74  er to do.** what
2a5f0 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57  ever it does.  W
2a600 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20  hile this other 
2a610 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
2a620 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f  ng the.** file o
2a630 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20  pen, we will be 
2a640 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
2a650 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72   it.  To work ar
2a660 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f  ound this.** pro
2a670 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31  blem, we delay 1
2a680 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
2a690 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74  and try to delet
2a6a0 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20  e again.  Up.** 
2a6b0 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  to MX_DELETION_A
2a6c0 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e  TTEMPTs deletion
2a6d0 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75   attempts are ru
2a6e0 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a  n before giving.
2a6f0 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ** up and return
2a700 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
2a710 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
2a720 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
2a730 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2a740 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
2a750 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
2a760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2a770 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
2a780 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
2a790 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79  lete */.  int sy
2a7a0 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20  ncDir           
2a7b0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
2a7c0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b  d on win32 */.){
2a7d0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
2a7e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
2a7f0 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20  D attr;.  DWORD 
2a800 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
2a810 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
2a820 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
2a830 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
2a840 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a850 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
2a860 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
2a870 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a880 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52  _DELETE);.  OSTR
2a890 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
2a8a0 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64  e=%s, syncDir=%d
2a8b0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2a8c0 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43  syncDir));..  zC
2a8d0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
2a8e0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
2a8f0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
2a900 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
2a910 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
2a920 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
2a930 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
2a940 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
2a950 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
2a960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a970 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2a980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
2a990 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b  NT() ){.    do {
2a9a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2a9b0 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32  INRT.      WIN32
2a9c0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
2a9d0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
2a9e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41        memset(&sA
2a9f0 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
2aa00 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
2aa10 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74        if ( osGet
2aa20 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
2aa30 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65  W(zConverted, Ge
2aa40 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
2aa50 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa70 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
2aa80 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  a) ){.        at
2aa90 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
2aaa0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
2aab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2aac0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
2aad0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
2aae0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
2aaf0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
2ab00 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
2ab10 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
2ab20 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
2ab30 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
2ab40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2ab50 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2ab60 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
2ab70 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
2ab80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ab90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2aba0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2abb0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
2abc0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
2abd0 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
2abe0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
2abf0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  W(zConverted);.#
2ac00 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28  endif.      if (
2ac10 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
2ac20 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
2ac30 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
2ac40 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
2ac50 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
2ac60 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
2ac70 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
2ac80 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
2ac90 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
2aca0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
2acb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2acc0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
2acd0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
2ace0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
2acf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2ad00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2ad10 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2ad20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
2ad30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2ad40 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
2ad50 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
2ad60 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
2ad70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2ad80 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
2ad90 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
2ada0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2adb0 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
2adc0 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65  eFileW(zConverte
2add0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
2ade0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
2adf0 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
2ae00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2ae10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
2ae20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
2ae30 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
2ae40 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
2ae50 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2ae60 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
2ae70 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
2ae80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2ae90 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
2aea0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2aeb0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
2aec0 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b    else{.    do {
2aed0 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
2aee0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2aef0 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sA(zConverted);.
2af00 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d        if ( attr=
2af10 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
2af20 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20  TRIBUTES ){.    
2af30 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
2af40 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2af50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
2af60 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
2af70 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
2af80 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
2af90 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
2afa0 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
2afb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2afc0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
2afd0 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
2afe0 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
2aff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b000 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b010 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
2b020 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2b030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b040 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54   ( attr&FILE_ATT
2b050 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
2b060 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b070 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
2b080 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f  * Files only. */
2b090 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2b0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b0b0 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41   ( osDeleteFileA
2b0c0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
2b0d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2b0e0 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74  ITE_OK; /* Delet
2b0f0 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20  ed OK. */.      
2b100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2b110 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e  .      if ( !win
2b120 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
2b130 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
2b140 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2b150 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
2b160 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
2b170 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
2b180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
2b190 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e  hile(1);.  }.#en
2b1a0 64 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20  dif.  if( rc && 
2b1b0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2b1c0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b  _DELETE_NOENT ){
2b1d0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
2b1e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
2b1f0 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45  RR_DELETE, lastE
2b200 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65  rrno, "winDelete
2b210 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
2b220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c   }else{.    winL
2b230 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c  ogIoerr(cnt, __L
2b240 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 73 71  INE__);.  }.  sq
2b250 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2b260 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43  erted);.  OSTRAC
2b270 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
2b280 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46  %s, rc=%s\n", zF
2b290 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
2b2a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
2b2b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b2c0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65  *.** Check the e
2b2d0 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61  xistence and sta
2b2e0 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tus of a file..*
2b2f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2b300 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
2b310 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2b320 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
2b330 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
2b340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2b350 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
2b360 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
2b370 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
2b380 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2b390 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
2b3a0 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
2b3b0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
2b3c0 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
2b3d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2b3e0 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44  Result */.){.  D
2b3f0 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
2b400 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
2b410 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
2b420 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
2b430 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
2b440 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
2b450 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2b460 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2b470 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
2b480 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43  .  OSTRACE(("ACC
2b490 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61  ESS name=%s, fla
2b4a0 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25  gs=%x, pResOut=%
2b4b0 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
2b4c0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67   zFilename, flag
2b4d0 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  s, pResOut));.. 
2b4e0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
2b4f0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
2b500 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
2b510 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
2b520 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
2b530 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
2b540 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
2b550 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
2b560 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  n", zFilename));
2b570 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b580 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2b590 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  KPT;.  }.  if( o
2b5a0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
2b5b0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
2b5c0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
2b5d0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
2b5e0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
2b5f0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
2b600 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
2b610 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
2b620 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
2b630 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
2b640 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
2b650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
2b670 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
2b680 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6a0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
2b6b0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
2b6c0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
2b6d0 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
2b6e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
2b6f0 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
2b700 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
2b710 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
2b720 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
2b730 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
2b740 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
2b750 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
2b760 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
2b770 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
2b780 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
2b790 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
2b7a0 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  h==0.          &
2b7b0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
2b7c0 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
2b7d0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
2b7e0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
2b7f0 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
2b800 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
2b810 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
2b820 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
2b830 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b840 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f  {.      winLogIo
2b850 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
2b860 5f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  _);.      if( la
2b870 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46  stErrno!=ERROR_F
2b880 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26  ILE_NOT_FOUND &&
2b890 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
2b8a0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
2b8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2b8c0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2b8d0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
2b8e0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2b8f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
2b900 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  CESS, lastErrno,
2b910 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20   "winAccess",.  
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b930 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
2b940 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
2b950 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
2b960 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
2b970 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
2b980 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
2b990 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2b9a0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
2b9b0 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
2b9c0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
2b9d0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
2b9e0 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
2b9f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ba00 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
2ba10 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2ba20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2ba30 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
2ba40 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2ba50 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
2ba60 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
2ba70 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
2ba80 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
2ba90 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2baa0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
2bab0 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TE:.      rc = a
2bac0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
2bad0 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
2bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74               (at
2baf0 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
2bb00 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  UTE_READONLY)==0
2bb10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2bb20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2bb30 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2bb40 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2bb50 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2bb60 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
2bb70 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
2bb80 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%s, pResOut=%p
2bb90 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
2bba0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
2bbb0 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
2bbc0 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a  name, pResOut, *
2bbd0 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
2bbe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2bbf0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
2bc00 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2bc10 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
2bc20 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
2bc30 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a  a drive letter.*
2bc40 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  * followed by a 
2bc50 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e  colon character.
2bc60 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
2bc70 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
2bc80 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73  AndColon(.  cons
2bc90 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
2bca0 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20  e.){.  return ( 
2bcb0 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
2bcc0 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20  Pathname[0]) && 
2bcd0 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a  zPathname[1]==':
2bce0 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ' );.}../*.** Re
2bcf0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
2bd00 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
2bd10 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
2bd20 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69   be used verbati
2bd30 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65  m.  If.** non-ze
2bd40 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  ro is returned f
2bd50 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
2bd60 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  n, the calling f
2bd70 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d  unction must sim
2bd80 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70  ply.** use the p
2bd90 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d  rovided path nam
2bda0 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20  e verbatim -OR- 
2bdb0 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20  resolve it into 
2bdc0 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  a full path name
2bdd0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65  .** using the Ge
2bde0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69  tFullPathName Wi
2bdf0 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  n32 API function
2be00 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e   (if available).
2be10 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
2be20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
2be30 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  hname(.  const c
2be40 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
2be50 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  {.  /*.  ** If t
2be60 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
2be70 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61  rts with a forwa
2be80 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61  rd slash or a ba
2be90 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65  ckslash, it is e
2bea0 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67  ither.  ** a leg
2beb0 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76  al UNC name, a v
2bec0 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70  olume relative p
2bed0 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c  ath, or an absol
2bee0 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e  ute path name in
2bef0 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22   the.  ** "Unix"
2bf00 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f   format on Windo
2bf10 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ws.  There is no
2bf20 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66   easy way to dif
2bf30 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
2bf40 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  en.  ** the fina
2bf50 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65  l two cases; the
2bf60 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72  refore, we retur
2bf70 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75  n the safer retu
2bf80 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45  rn value of TRUE
2bf90 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61  .  ** so that ca
2bfa0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
2bfb0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70  nction will simp
2bfc0 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74  ly use it verbat
2bfd0 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  im..  */.  if ( 
2bfe0 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74  winIsDirSep(zPat
2bff0 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  hname[0]) ){.   
2c000 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
2c010 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
2c020 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
2c030 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74  arts with a lett
2c040 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69  er and a colon i
2c050 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f  t is either a vo
2c060 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69  lume.  ** relati
2c070 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62  ve path or an ab
2c080 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61  solute path.  Ca
2c090 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
2c0a0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a  nction must not.
2c0b0 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    ** attempt to 
2c0c0 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65  treat it as a re
2c0d0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
2c0e0 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75   (i.e. they shou
2c0f0 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20  ld simply use.  
2c100 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e  ** it verbatim).
2c110 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e  .  */.  if ( win
2c120 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
2c130 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29  Colon(zPathname)
2c140 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2c150 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
2c160 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   ** If we get to
2c170 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2c180 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
2c190 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  d almost certain
2c1a0 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20  ly be a purely. 
2c1b0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65   ** relative one
2c1c0 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43   (i.e. not a UNC
2c1d0 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c   name, not absol
2c1e0 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c  ute, and not vol
2c1f0 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20  ume relative).. 
2c200 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c   */.  return FAL
2c210 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  SE;.}../*.** Tur
2c220 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
2c230 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
2c240 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
2c250 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
2c260 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
2c270 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
2c280 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
2c290 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
2c2a0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
2c2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2c2c0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
2c2d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2c2e0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
2c2f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
2c300 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
2c310 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
2c320 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
2c330 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
2c340 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
2c350 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c370 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
2c380 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
2c390 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
2c3a0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
2c3b0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
2c3c0 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ffer */.){.#if !
2c3d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
2c3e0 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
2c3f0 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
2c400 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57  __CYGWIN__).  DW
2c410 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  ORD nByte;.  voi
2c420 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
2c430 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 23 65 6e   char *zOut;.#en
2c440 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  dif..  /* If thi
2c450 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69  s path name begi
2c460 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77  ns with "/X:", w
2c470 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20  here "X" is any 
2c480 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20  alphabetic.  ** 
2c490 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61  character, disca
2c4a0 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22  rd the initial "
2c4b0 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68  /" from the path
2c4c0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
2c4d0 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
2c4e0 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65  /' && winIsDrive
2c4f0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
2c500 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20  Relative+1) ){. 
2c510 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
2c520 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
2c530 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
2c540 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2c550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2c560 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
2c570 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
2c580 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c  ;.  assert( nFul
2c590 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l>=pVfs->mxPathn
2c5a0 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ame );.  if ( sq
2c5b0 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2c5c0 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
2c5d0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
2c5e0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
2c5f0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
2c600 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
2c610 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
2c620 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
2c630 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
2c640 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
2c650 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
2c660 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
2c670 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
2c680 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
2c690 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
2c6a0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
2c6b0 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
2c6c0 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
2c6d0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
2c6e0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
2c6f0 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20  and a slash..   
2c700 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   */.    char *zO
2c710 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ut = sqlite3Mall
2c720 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78  ocZero( pVfs->mx
2c730 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20  Pathname+1 );.  
2c740 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20    if( !zOut ){. 
2c750 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c760 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2c770 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2c780 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
2c790 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
2c7a0 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50   (osIsNT() ? CCP
2c7b0 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
2c7c0 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
2c7d0 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20  IN_A) |.        
2c7e0 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45      CCP_RELATIVE
2c7f0 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  , zRelative, zOu
2c800 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t, pVfs->mxPathn
2c810 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  ame+1)<0 ){.    
2c820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c830 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Out);.      retu
2c840 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2c850 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
2c860 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
2c870 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
2c8a0 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
2c8b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c8c0 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
2c8d0 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
2c8e0 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20  ilename(zOut);. 
2c8f0 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
2c900 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2c910 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2c920 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c930 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2c940 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
2c950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2c960 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2c970 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c980 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
2c990 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c9b0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2c9c0 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
2c9d0 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  (), zUtf8);.    
2c9e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c9f0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
2ca00 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2ca10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2ca20 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
2ca30 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
2ca40 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
2ca50 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
2ca60 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
2ca70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ca80 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2ca90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
2caa0 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
2cab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73  .            (os
2cac0 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
2cad0 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
2cae0 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
2caf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
2cb00 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20  Relative, zOut, 
2cb10 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2cb20 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  +1)<0 ){.      s
2cb30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2cb40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2cb50 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2cb60 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
2cb70 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72  PATH, (DWORD)err
2cb80 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
2cba0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c  nFullPathname2",
2cbb0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2cbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2cbd0 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43  ar *zUtf8 = winC
2cbe0 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65  onvertToUtf8File
2cbf0 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  name(zOut);.    
2cc00 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a    if( !zUtf8 ){.
2cc10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2cc20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
2cc30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cc40 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2cc50 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
2cc60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2cc70 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
2cc80 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
2cc90 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55   zFull, "%s", zU
2cca0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
2ccb0 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
2ccc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2ccd0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
2cce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2ccf0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
2cd00 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f  .#if (SQLITE_OS_
2cd10 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
2cd20 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65  OS_WINRT) && !de
2cd30 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
2cd40 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
2cd50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2cd60 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a  TE_ERROR );.  /*
2cd70 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
2cd80 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
2cd90 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
2cda0 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
2cdb0 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
2cdc0 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
2cdd0 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
2cde0 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
2cdf0 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28  e one. */.  if (
2ce00 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
2ce10 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
2ce20 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
2ce30 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
2ce40 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
2ce50 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
2ce60 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
2ce70 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
2ce80 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
2ce90 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
2cea0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
2ceb0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
2cec0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
2ced0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
2cee0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
2cef0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2cf00 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
2cf10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
2cf20 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
2cf30 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
2cf40 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
2cf50 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
2cf60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2cf70 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2cf80 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2cf90 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
2cfc0 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
2cfd0 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
2cfe0 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ative);.  }else{
2cff0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2d000 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2d010 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2d020 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
2d030 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
2d040 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2d050 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
2d060 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
2d070 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
2d080 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
2d090 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2d0a0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
2d0b0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
2d0c0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
2d0d0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
2d0e0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
2d0f0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
2d100 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
2d110 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
2d120 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
2d130 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
2d140 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
2d150 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
2d160 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
2d170 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
2d180 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
2d190 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
2d1a0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
2d1b0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2d1c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
2d1d0 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
2d1e0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
2d1f0 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
2d200 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
2d210 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
2d220 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
2d230 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2d240 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2d250 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
2d260 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
2d270 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
2d280 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
2d290 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
2d2a0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
2d2b0 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
2d2c0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
2d2d0 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
2d2e0 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
2d2f0 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
2d300 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
2d310 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
2d320 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
2d330 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2d340 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2d350 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2d360 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
2d370 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2d380 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d390 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
2d3a0 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
2d3b0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2d3c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d3d0 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
2d3e0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
2d3f0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
2d400 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  e(zRelative);.  
2d410 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
2d420 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2d430 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2d440 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
2d450 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
2d460 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
2d470 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
2d480 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
2d490 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
2d4a0 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
2d4b0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2d4c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2d4d0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2d4e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2d4f0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2d500 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2d510 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2d520 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d540 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2d550 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
2d560 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
2d570 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
2d580 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2d590 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
2d5a0 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
2d5b0 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
2d5c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d5d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2d5e0 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
2d5f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2d600 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2d610 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2d620 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
2d630 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
2d640 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
2d650 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
2d660 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
2d670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2d680 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2d690 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
2d6a0 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
2d6b0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
2d6c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
2d6d0 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
2d6e0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d700 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
2d710 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame2", zRelative
2d720 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2d730 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2d740 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
2d750 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
2d760 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
2d770 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
2d780 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  p);.  }.#ifdef S
2d790 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2d7a0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
2d7b0 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
2d7c0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
2d7d0 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
2d7e0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
2d7f0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
2d800 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2d810 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2d820 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2d830 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2d840 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2d850 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2d860 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2d870 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2d880 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2d890 46 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20  FullPathname3", 
2d8a0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2d8b0 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
2d8c0 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
2d8d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2d8e0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
2d8f0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
2d900 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
2d910 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2d920 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2d930 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d940 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2d950 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2d960 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2d970 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
2d980 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
2d990 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
2d9a0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2d9b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2d9c0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2d9d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d9e0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2d9f0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2da00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2da10 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2da20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2da30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2da40 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2da50 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20  FullPathname4", 
2da60 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2da70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2da80 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2da90 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62      zOut = winMb
2daa0 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20  csToUtf8(zTemp, 
2dab0 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
2dac0 49 28 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  I());.    sqlite
2dad0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2dae0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2daf0 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
2db00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
2db10 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
2db20 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
2db30 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
2db40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2db50 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  zOut);.    retur
2db60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2db70 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2db80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2db90 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  MEM_BKPT;.  }.#e
2dba0 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ndif.}..#ifndef 
2dbb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2dbc0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
2dbd0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
2dbe0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
2dbf0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
2dc00 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
2dc10 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
2dc20 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
2dc30 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
2dc40 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
2dc50 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
2dc60 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
2dc70 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
2dc80 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
2dc90 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 23 69  {.  HANDLE h;.#i
2dca0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
2dcb0 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46 75 6c  IN__).  int nFul
2dcc0 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  l = pVfs->mxPath
2dcd0 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72 20 2a  name+1;.  char *
2dce0 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d  zFull = sqlite3M
2dcf0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75 6c 6c  allocZero( nFull
2dd00 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   );.  void *zCon
2dd10 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
2dd20 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( zFull==0 ){.  
2dd30 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50    OSTRACE(("DLOP
2dd40 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64  EN name=%s, hand
2dd50 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e  le=%p\n", zFilen
2dd60 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b  ame, (void*)0));
2dd70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd80 20 7d 0a 20 20 69 66 28 20 77 69 6e 46 75 6c 6c   }.  if( winFull
2dd90 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2dda0 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c  Filename, nFull,
2ddb0 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54 45 5f   zFull)!=SQLITE_
2ddc0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2ddd0 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 20  3_free(zFull);. 
2dde0 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2ddf0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2de00 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2de10 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2de20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2de30 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64    }.  zConverted
2de40 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2de50 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
2de60 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ull);.  sqlite3_
2de70 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c  free(zFull);.#el
2de80 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  se.  void *zConv
2de90 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
2dea0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
2deb0 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
2dec0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ded0 52 28 70 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a  R(pVfs);.#endif.
2dee0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
2def0 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
2df00 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2df10 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2df20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2df30 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2df40 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
2df50 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
2df60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2df70 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  T.    h = osLoad
2df80 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28  PackagedLibrary(
2df90 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
2dfa0 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ted, 0);.#else. 
2dfb0 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
2dfc0 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a  raryW((LPCWSTR)z
2dfd0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
2dfe0 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
2dff0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2e000 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
2e010 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
2e020 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
2e030 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
2e040 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  f.  OSTRACE(("DL
2e050 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
2e060 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
2e070 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29  ename, (void*)h)
2e080 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2e090 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2e0a0 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
2e0b0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2e0c0 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
2e0d0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2e0e0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2e0f0 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
2e100 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2e110 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72  ;.  winGetLastEr
2e120 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
2e130 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
2e140 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69  BufOut);.}.stati
2e150 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79  c void (*winDlSy
2e160 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
2e170 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e  Vfs,void *pH,con
2e180 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28  st char *zSym))(
2e190 76 6f 69 64 29 7b 0a 20 20 46 41 52 50 52 4f 43  void){.  FARPROC
2e1a0 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f   proc;.  UNUSED_
2e1b0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2e1c0 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47 65 74 50  .  proc = osGetP
2e1d0 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e  rocAddressA((HAN
2e1e0 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20  DLE)pH, zSym);. 
2e1f0 20 4f 53 54 52 41 43 45 28 28 22 44 4c 53 59 4d   OSTRACE(("DLSYM
2e200 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62   handle=%p, symb
2e210 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73 73 3d 25  ol=%s, address=%
2e220 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
2e230 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d   (void*)pH, zSym
2e240 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b  , (void*)proc));
2e250 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28  .  return (void(
2e260 2a 29 28 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d  *)(void))proc;.}
2e270 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2e280 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
2e290 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
2e2a0 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
2e2b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2e2c0 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62  fs);.  osFreeLib
2e2d0 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61  rary((HANDLE)pHa
2e2e0 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41 43 45  ndle);.  OSTRACE
2e2f0 28 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c  (("DLCLOSE handl
2e300 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29  e=%p\n", (void*)
2e310 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c  pHandle));.}.#el
2e320 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
2e330 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2e340 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
2e350 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
2e360 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
2e370 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
2e380 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
2e390 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
2e3a0 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
2e3b0 65 6e 64 69 66 0a 0a 2f 2a 20 53 74 61 74 65 20  endif../* State 
2e3c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2e3d0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 67  the randomness g
2e3e0 61 74 68 65 72 65 72 2e 20 2a 2f 0a 74 79 70 65  atherer. */.type
2e3f0 64 65 66 20 73 74 72 75 63 74 20 45 6e 74 72 6f  def struct Entro
2e400 70 79 47 61 74 68 65 72 65 72 20 45 6e 74 72 6f  pyGatherer Entro
2e410 70 79 47 61 74 68 65 72 65 72 3b 0a 73 74 72 75  pyGatherer;.stru
2e420 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  ct EntropyGather
2e430 65 72 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  er {.  unsigned 
2e440 63 68 61 72 20 2a 61 3b 20 20 20 2f 2a 20 47 61  char *a;   /* Ga
2e450 74 68 65 72 20 65 6e 74 72 6f 70 79 20 69 6e 74  ther entropy int
2e460 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
2e470 0a 20 20 69 6e 74 20 6e 61 3b 20 20 20 20 20 20  .  int na;      
2e480 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2e490 66 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  f a[] in bytes *
2e4a0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
2e4b0 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6e          /* XOR n
2e4c0 65 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20 61  ext input into a
2e4d0 5b 69 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 58 6f  [i] */.  int nXo
2e4e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2e4f0 4e 75 6d 62 65 72 20 6f 66 20 58 4f 52 20 6f 70  Number of XOR op
2e500 65 72 61 74 69 6f 6e 73 20 64 6f 6e 65 20 2a 2f  erations done */
2e510 0a 7d 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  .};..#if !define
2e520 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
2e530 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
2e540 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53  E_OMIT_RANDOMNES
2e550 53 29 0a 2f 2a 20 4d 69 78 20 73 7a 20 62 79 74  S)./* Mix sz byt
2e560 65 73 20 6f 66 20 65 6e 74 72 6f 70 79 20 69 6e  es of entropy in
2e570 74 6f 20 70 2e 20 2a 2f 0a 73 74 61 74 69 63 20  to p. */.static 
2e580 76 6f 69 64 20 78 6f 72 4d 65 6d 6f 72 79 28 45  void xorMemory(E
2e590 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 2a  ntropyGatherer *
2e5a0 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  p, unsigned char
2e5b0 20 2a 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20   *x, int sz){.  
2e5c0 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 66 6f 72 28  int j, k;.  for(
2e5d0 6a 3d 30 2c 20 6b 3d 70 2d 3e 69 3b 20 6a 3c 73  j=0, k=p->i; j<s
2e5e0 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  z; j++){.    p->
2e5f0 61 5b 6b 2b 2b 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a  a[k++] ^= x[j];.
2e600 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e 61      if( k>=p->na
2e610 20 29 20 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   ) k = 0;.  }.  
2e620 70 2d 3e 69 20 3d 20 6b 3b 0a 20 20 70 2d 3e 6e  p->i = k;.  p->n
2e630 58 6f 72 20 2b 3d 20 73 7a 3b 0a 7d 0a 23 65 6e  Xor += sz;.}.#en
2e640 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
2e650 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
2e660 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e670 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
2e680 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65   */../*.** Write
2e690 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
2e6a0 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
2e6b0 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
2e6c0 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
2e6d0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
2e6e0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2e6f0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2e700 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2e710 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
2e720 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2e730 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 55  _RANDOMNESS).  U
2e740 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2e750 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74 28  pVfs);.  memset(
2e760 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
2e770 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 23    return nBuf;.#
2e780 65 6c 73 65 0a 20 20 45 6e 74 72 6f 70 79 47 61  else.  EntropyGa
2e790 74 68 65 72 65 72 20 65 3b 0a 20 20 55 4e 55 53  therer e;.  UNUS
2e7a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2e7b0 73 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75  s);.  memset(zBu
2e7c0 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 65  f, 0, nBuf);.  e
2e7d0 2e 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  .a = (unsigned c
2e7e0 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 65 2e 6e  har*)zBuf;.  e.n
2e7f0 61 20 3d 20 6e 42 75 66 3b 0a 20 20 65 2e 6e 58  a = nBuf;.  e.nX
2e800 6f 72 20 3d 20 30 3b 0a 20 20 65 2e 69 20 3d 20  or = 0;.  e.i = 
2e810 30 3b 0a 20 20 7b 0a 20 20 20 20 53 59 53 54 45  0;.  {.    SYSTE
2e820 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47  MTIME x;.    osG
2e830 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29  etSystemTime(&x)
2e840 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2e850 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2e860 61 72 2a 29 26 78 2c 20 73 69 7a 65 6f 66 28 53  ar*)&x, sizeof(S
2e870 59 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20 20 7d  YSTEMTIME));.  }
2e880 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  .  {.    DWORD p
2e890 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
2e8a0 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
2e8b0 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2e8c0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2e8d0 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 44 57 4f  &pid, sizeof(DWO
2e8e0 52 44 29 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51  RD));.  }.#if SQ
2e8f0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2e900 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20  {.    ULONGLONG 
2e910 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
2e920 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 78 6f  ount64();.    xo
2e930 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2e940 69 67 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74  igned char*)&cnt
2e950 2c 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f  , sizeof(ULONGLO
2e960 4e 47 29 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  NG));.  }.#else.
2e970 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e    {.    DWORD cn
2e980 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
2e990 6e 74 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  nt();.    xorMem
2e9a0 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2e9b0 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69  d char*)&cnt, si
2e9c0 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20 20  zeof(DWORD));.  
2e9d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2e9e0 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 20  TE_OS_WINRT */. 
2e9f0 20 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54   {.    LARGE_INT
2ea00 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75  EGER i;.    osQu
2ea10 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
2ea20 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 78  unter(&i);.    x
2ea30 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e  orMemory(&e, (un
2ea40 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 2c  signed char*)&i,
2ea50 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
2ea60 54 45 47 45 52 29 29 3b 0a 20 20 7d 0a 23 69 66  TEGER));.  }.#if
2ea70 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
2ea80 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
2ea90 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
2eaa0 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20  WIN32_USE_UUID. 
2eab0 20 7b 0a 20 20 20 20 55 55 49 44 20 69 64 3b 0a   {.    UUID id;.
2eac0 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20      memset(&id, 
2ead0 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29  0, sizeof(UUID))
2eae0 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65 61  ;.    osUuidCrea
2eaf0 74 65 28 26 69 64 29 3b 0a 20 20 20 20 78 6f 72  te(&id);.    xor
2eb00 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2eb10 67 6e 65 64 20 63 68 61 72 2a 29 26 69 64 2c 20  gned char*)&id, 
2eb20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20  sizeof(UUID));. 
2eb30 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30     memset(&id, 0
2eb40 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2eb50 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74  .    osUuidCreat
2eb60 65 53 65 71 75 65 6e 74 69 61 6c 28 26 69 64 29  eSequential(&id)
2eb70 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2eb80 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2eb90 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66 28  ar*)&id, sizeof(
2eba0 55 55 49 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  UUID));.  }.#end
2ebb0 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53  if /* !SQLITE_OS
2ebc0 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
2ebd0 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51  E_OS_WINRT && SQ
2ebe0 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55  LITE_WIN32_USE_U
2ebf0 55 49 44 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  UID */.  return 
2ec00 65 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20 6e 42  e.nXor>nBuf ? nB
2ec10 75 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e  uf : e.nXor;.#en
2ec20 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
2ec30 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
2ec40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2ec50 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a  IT_RANDOMNESS) *
2ec60 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  /.}.../*.** Slee
2ec70 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
2ec80 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
2ec90 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
2eca0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
2ecb0 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
2ecc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2ecd0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
2ece0 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  .  sqlite3_win32
2ecf0 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63  _sleep((microsec
2ed00 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
2ed10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ed20 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
2ed30 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
2ed40 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
2ed50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2ed60 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
2ed70 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
2ed80 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
2ed90 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
2eda0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
2edb0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
2edc0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
2edd0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
2ede0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
2edf0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
2ee00 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
2ee10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2ee20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
2ee30 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
2ee40 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
2ee50 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
2ee60 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
2ee70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
2ee80 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2ee90 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2eea0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2eeb0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2eec0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
2eed0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
2eee0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2eef0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
2ef00 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
2ef10 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
2ef20 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2ef30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2ef40 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
2ef50 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
2ef60 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
2ef70 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
2ef80 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
2ef90 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
2efa0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
2efb0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
2efc0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
2efd0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
2efe0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
2eff0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
2f000 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2f010 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  ate.** cannot be
2f020 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2f030 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
2f040 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
2f050 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
2f060 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
2f070 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
2f080 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
2f090 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
2f0a0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
2f0b0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30  umber of.     10
2f0c0 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
2f0d0 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
2f0e0 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
2f0f0 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20  JD 2305813.5).. 
2f100 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66   */.  FILETIME f
2f110 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  t;.  static cons
2f120 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2f130 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
2f140 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c   = 23058135*(sql
2f150 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
2f160 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  00;.#ifdef SQLIT
2f170 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
2f180 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2f190 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
2f1a0 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
2f1b0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
2f1c0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33  .#endif.  /* 2^3
2f1d0 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65  2 - to avoid use
2f1e0 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69   of LL and warni
2f1f0 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20  ngs in gcc */.  
2f200 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2f210 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32  ite3_int64 max32
2f220 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20  BitValue =.     
2f230 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2f240 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
2f250 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2f260 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28  000000 +.      (
2f270 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39  sqlite3_int64)29
2f280 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51  4967296;..#if SQ
2f290 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
2f2a0 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b  SYSTEMTIME time;
2f2b0 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  .  osGetSystemTi
2f2c0 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20  me(&time);.  /* 
2f2d0 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  if SystemTimeToF
2f2e0 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c  ileTime() fails,
2f2f0 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
2f300 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79  . */.  if (!osSy
2f310 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
2f320 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a  me(&time,&ft)){.
2f330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f340 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c  E_ERROR;.  }.#el
2f350 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  se.  osGetSystem
2f360 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20  TimeAsFileTime( 
2f370 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  &ft );.#endif.. 
2f380 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c   *piNow = winFil
2f390 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20  etimeEpoch +.   
2f3a0 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c           ((((sql
2f3b0 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
2f3c0 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61  HighDateTime)*ma
2f3d0 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20  x32BitValue) +. 
2f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2f3f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
2f400 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28  dwLowDateTime)/(
2f410 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30  sqlite3_int64)10
2f420 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  000;..#ifdef SQL
2f430 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
2f440 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2f450 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f  ime ){.    *piNo
2f460 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65  w = 1000*(sqlite
2f470 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f  3_int64)sqlite3_
2f480 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75  current_time + u
2f490 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65  nixEpoch;.  }.#e
2f4a0 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41  ndif.  UNUSED_PA
2f4b0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2f4c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f4d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  K;.}../*.** Find
2f4e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2f4f0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2f500 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2f510 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
2f520 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2f530 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2f540 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
2f550 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
2f560 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
2f570 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
2f580 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
2f590 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2f5a0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
2f5b0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
2f5c0 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
2f5d0 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74  e *prNow){.  int
2f5e0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
2f5f0 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77  nt64 i;.  rc = w
2f600 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2f610 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20  64(pVfs, &i);.  
2f620 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a  if( !rc ){.    *
2f630 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
2f640 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  00.0;.  }.  retu
2f650 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f660 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
2f670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2f680 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62  orks like a comb
2f690 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65  ination of.** Ge
2f6a0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64  tLastError() and
2f6b0 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29   FormatMessage()
2f6c0 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20   on Windows (or 
2f6d0 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72  errno and.** str
2f6e0 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69  error_r() on Uni
2f6f0 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72  x). After an err
2f700 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
2f710 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74  y an OS.** funct
2f720 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c  ion, SQLite call
2f730 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
2f740 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69  with zBuf pointi
2f750 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  ng to.** a buffe
2f760 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e  r of nBuf bytes.
2f770 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68   The OS layer sh
2f780 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68  ould populate th
2f790 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68  e.** buffer with
2f7a0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
2f7b0 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  d UTF-8 encoded 
2f7c0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
2f7d0 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
2f7e0 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f  last IO error to
2f7f0 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77   have occurred w
2f800 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ithin the callin
2f810 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  g.** thread..**.
2f820 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
2f830 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  message is too l
2f840 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70  arge for the sup
2f850 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a  plied buffer,.**
2f860 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72   it should be tr
2f870 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74  uncated. The ret
2f880 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65  urn value of xGe
2f890 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73  tLastError.** is
2f8a0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
2f8b0 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
2f8c0 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
2f8d0 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
2f8e0 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
2f8f0 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
2f900 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a  cated). If non-z
2f910 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
2f920 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e  .** then it is n
2f930 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
2f940 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d  include the nul-
2f950 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61  terminator chara
2f960 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  cter.** in the o
2f970 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a  utput buffer..**
2f980 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e  .** Not supplyin
2f990 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
2f9a0 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  ge will have no 
2f9b0 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a  adverse effect.*
2f9c0 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20  * on SQLite. It 
2f9d0 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20  is fine to have 
2f9e0 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
2f9f0 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20  n that never.** 
2fa00 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2fa10 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20   message:.**.** 
2fa20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72    int xGetLastEr
2fa30 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
2fa40 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
2fa50 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a   char *zBuf){.**
2fa60 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66       assert(zBuf
2fa70 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20  [0]=='\0');.**  
2fa80 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20     return 0;.** 
2fa90 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65    }.**.** Howeve
2faa0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  r if an error me
2fab0 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65  ssage is supplie
2fac0 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e  d, it will be in
2fad0 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79  corporated.** by
2fae0 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65   sqlite into the
2faf0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
2fb00 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
2fb10 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  user using.** sq
2fb20 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20  lite3_errmsg(), 
2fb30 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20  possibly making 
2fb40 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72  IO errors easier
2fb50 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74   to debug..*/.st
2fb60 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
2fb70 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
2fb80 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2fb90 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2fba0 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f  ){.  DWORD e = o
2fbb0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
2fbc0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2fbd0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28  TER(pVfs);.  if(
2fbe0 20 6e 42 75 66 3e 30 20 29 20 77 69 6e 47 65 74   nBuf>0 ) winGet
2fbf0 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 65 2c 20  LastErrorMsg(e, 
2fc00 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 20 20 72  nBuf, zBuf);.  r
2fc10 65 74 75 72 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn e;.}../*.*
2fc20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
2fc30 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
2fc40 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2fc50 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
2fc60 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2fc70 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
2fc80 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2fc90 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
2fca0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2fcb0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2fcc0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2fcd0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20  (winFile),      
2fce0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2fcf0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
2fd00 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2fd10 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2fd20 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fd40 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2fd50 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  n32",           
2fd60 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2fd70 20 20 20 20 26 77 69 6e 41 70 70 44 61 74 61 2c      &winAppData,
2fd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41             /* pA
2fd90 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
2fda0 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
2fdb0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2fdc0 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2fde0 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2fdf0 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2fe00 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2fe10 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2fe20 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  thname,       /*
2fe30 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2fe40 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe60 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2fe70 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2fe80 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2fe90 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2fea0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
2feb0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2fec0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2fed0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
2fee0 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
2fef0 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
2ff00 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2ff10 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2ff20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ff30 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2ff40 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2ff50 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65         /* xCurre
2ff60 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2ff70 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2ff80 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2ff90 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2ffa0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2ffb0 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  ,   /* xCurrentT
2ffc0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2ffd0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2ffe0 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ,      /* xSetSy
2fff0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
30000 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
30010 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ,      /* xGetSy
30020 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
30030 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
30040 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53  l,     /* xNextS
30050 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
30060 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
30070 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
30080 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71  IDE).  static sq
30090 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e  lite3_vfs winLon
300a0 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20  gPathVfs = {.   
300b0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
300c0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
300d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
300e0 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20  f(winFile),     
300f0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
30100 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e  .    SQLITE_WINN
30110 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  T_MAX_PATH_BYTES
30120 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20  , /* mxPathname 
30130 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
30140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30150 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
30160 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20  in32-longpath", 
30170 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
30180 0a 20 20 20 20 26 77 69 6e 41 70 70 44 61 74 61  .    &winAppData
30190 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ,           /* p
301a0 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
301b0 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
301c0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
301d0 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
301e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
301f0 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
30200 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
30210 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
30220 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
30230 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f  athname,       /
30240 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
30250 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e  */.    winDlOpen
30260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
30270 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
30280 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  winDlError,     
30290 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
302a0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
302b0 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ym,             
302c0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
302d0 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
302e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
302f0 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
30300 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
30310 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
30320 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
30330 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
30340 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
30350 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
30360 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
30370 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
30380 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
30390 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73        /* xGetLas
303a0 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  tError */.    wi
303b0 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
303c0 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74  4,   /* xCurrent
303d0 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20  TimeInt64 */.   
303e0 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c   winSetSystemCal
303f0 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53  l,      /* xSetS
30400 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
30410 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
30420 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53  l,      /* xGetS
30430 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
30440 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
30450 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74  ll,     /* xNext
30460 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
30470 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 61 74  };.#endif.  stat
30480 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77  ic sqlite3_vfs w
30490 69 6e 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a  inNolockVfs = {.
304a0 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
304b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
304c0 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
304d0 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
304e0 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
304f0 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
30500 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
30510 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
30520 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
30530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30540 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
30550 20 22 77 69 6e 33 32 2d 6e 6f 6e 65 22 2c 20 20   "win32-none",  
30560 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
30570 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f 6c 6f   */.    &winNolo
30580 63 6b 41 70 70 44 61 74 61 2c 20 20 20 20 20 2f  ckAppData,     /
30590 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
305a0 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
305b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
305c0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
305d0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
305e0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
305f0 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
30600 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
30610 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
30620 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
30630 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
30640 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
30650 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
30660 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
30670 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
30680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
30690 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
306a0 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
306b0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
306c0 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
306d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
306e0 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
306f0 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
30700 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
30710 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
30720 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
30730 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
30740 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
30750 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43  me,        /* xC
30760 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
30770 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
30780 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74  r,       /* xGet
30790 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
307a0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
307b0 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72  nt64,   /* xCurr
307c0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
307d0 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
307e0 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53  Call,      /* xS
307f0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
30800 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d      winGetSystem
30810 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47  Call,      /* xG
30820 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
30830 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
30840 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e  mCall,     /* xN
30850 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
30860 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65  .  };.#if define
30870 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
30880 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69  AS_WIDE).  stati
30890 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
308a0 6e 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b 56  nLongPathNolockV
308b0 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
308c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308d0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
308e0 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
308f0 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73  ile),       /* s
30900 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
30910 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
30920 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
30930 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
30940 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
30950 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
30960 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c   */.    "win32-l
30970 6f 6e 67 70 61 74 68 2d 6e 6f 6e 65 22 2c 20 2f  ongpath-none", /
30980 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26  * zName */.    &
30990 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61  winNolockAppData
309a0 2c 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74  ,     /* pAppDat
309b0 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
309c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
309d0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
309e0 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
309f0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
30a00 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
30a10 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
30a20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
30a30 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
30a40 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c  e,       /* xFul
30a50 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
30a60 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
30a70 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
30a80 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
30a90 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
30aa0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
30ab0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
30ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
30ad0 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
30ae0 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
30af0 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
30b00 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
30b10 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
30b20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
30b30 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
30b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
30b50 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
30b60 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
30b70 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
30b80 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
30b90 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
30ba0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
30bb0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
30bc0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f  ntTimeInt64,   /
30bd0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
30be0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
30bf0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
30c00 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
30c10 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
30c20 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
30c30 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
30c40 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
30c50 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
30c60 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
30c70 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e  Call */.  };.#en
30c80 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65  dif..  /* Double
30c90 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20  -check that the 
30ca0 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79  aSyscall[] array
30cb0 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72   has been constr
30cc0 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65  ucted.  ** corre
30cd0 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65  ctly.  See ticke
30ce0 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65  t [bb3a86e890c8e
30cf0 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72  96ab] */.  asser
30d00 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79  t( ArraySize(aSy
30d10 73 63 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a 0a 20  scall)==80 );.. 
30d20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d   /* get memory m
30d30 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72  ap allocation gr
30d40 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d  anularity */.  m
30d50 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66  emset(&winSysInf
30d60 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53  o, 0, sizeof(SYS
30d70 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20  TEM_INFO));.#if 
30d80 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
30d90 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73    osGetNativeSys
30da0 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
30db0 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73  nfo);.#else.  os
30dc0 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  GetSystemInfo(&w
30dd0 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64  inSysInfo);.#end
30de0 69 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  if.  assert( win
30df0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
30e00 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e  tionGranularity>
30e10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  0 );.  assert( w
30e20 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
30e30 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c  Size>0 );..  sql
30e40 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
30e50 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a  r(&winVfs, 1);..
30e60 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
30e70 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
30e80 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  E).  sqlite3_vfs
30e90 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f  _register(&winLo
30ea0 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23  ngPathVfs, 0);.#
30eb0 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
30ec0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
30ed0 69 6e 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30 29 3b  inNolockVfs, 0);
30ee0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
30ef0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
30f00 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76  IDE).  sqlite3_v
30f10 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
30f20 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66  LongPathNolockVf
30f30 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  s, 0);.#endif.. 
30f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30f50 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  K;.}..int sqlite
30f60 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a  3_os_end(void){.
30f70 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
30f80 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f  NRT.  if( sleepO
30f90 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  bj!=NULL ){.    
30fa0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c  osCloseHandle(sl
30fb0 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65  eepObj);.    sle
30fc0 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  epObj = NULL;.  
30fd0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
30fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30ff0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31000 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.