/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a5ac9e249ed0ca33de6de27898a08d313effc40c:


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: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
0860: 65 65 20 69 66 20 74 68 65 20 47 65 74 56 65 72  ee if the GetVer
0870: 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74  sionEx[AW] funct
0880: 69 6f 6e 73 20 61 72 65 20 64 65 70 72 65 63 61  ions are depreca
0890: 74 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 74 61  ted on the.** ta
08a0: 72 67 65 74 20 73 79 73 74 65 6d 2e 20 20 47 65  rget system.  Ge
08b0: 74 56 65 72 73 69 6f 6e 45 78 20 77 61 73 20 66  tVersionEx was f
08c0: 69 72 73 74 20 64 65 70 72 65 63 61 74 65 64 20  irst deprecated 
08d0: 69 6e 20 57 69 6e 38 2e 31 2e 0a 2a 2f 0a 23 69  in Win8.1..*/.#i
08e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
08f0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
0900: 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 4e 54  #  if defined(NT
0910: 44 44 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20  DDI_VERSION) && 
0920: 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d  NTDDI_VERSION >=
0930: 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23   NTDDI_WINBLUE.#
0940: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0950: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
0960: 4f 4e 45 58 20 20 20 30 20 20 20 2f 2a 20 47 65  ONEX   0   /* Ge
0970: 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73 20  tVersionEx() is 
0980: 64 65 70 72 65 63 61 74 65 64 20 2a 2f 0a 23 20  deprecated */.# 
0990: 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
09a0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  e SQLITE_WIN32_G
09b0: 45 54 56 45 52 53 49 4f 4e 45 58 20 20 20 31 20  ETVERSIONEX   1 
09c0: 20 20 2f 2a 20 47 65 74 56 65 72 73 69 6f 6e 45    /* GetVersionE
09d0: 78 28 29 20 69 73 20 63 75 72 72 65 6e 74 20 2a  x() is current *
09e0: 2f 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  /.#  endif.#endi
09f0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  f../*.** This co
0a00: 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c  nstant should al
0a10: 72 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64  ready be defined
0a20: 20 28 69 6e 20 74 68 65 20 22 57 69 6e 44 65 66   (in the "WinDef
0a30: 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a  .h" SDK file)..*
0a40: 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 50 41  /.#ifndef MAX_PA
0a50: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 4d 41 58  TH.#  define MAX
0a60: 5f 50 41 54 48 20 20 20 20 20 20 20 20 20 20 20  _PATH           
0a70: 20 20 20 20 20 20 20 20 20 20 20 28 32 36 30 29             (260)
0a80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0a90: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0aa0: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0ab0: 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68  ) for Win32.  Th
0ac0: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0ad0: 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54  ly be.** MAX_PAT
0ae0: 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  H..*/.#ifndef SQ
0af0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
0b00: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0b10: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0b20: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0b30: 20 20 28 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e    (MAX_PATH).#en
0b40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0b50: 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20  constant should 
0b60: 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69 6e  already be defin
0b70: 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e 4e  ed (in the "WinN
0b80: 54 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a  T.h" SDK file)..
0b90: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 49 43 4f  */.#ifndef UNICO
0ba0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0bb0: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  ARS.#  define UN
0bc0: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0bd0: 5f 43 48 41 52 53 20 20 20 20 20 20 28 33 32 37  _CHARS      (327
0be0: 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  67).#endif../*.*
0bf0: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0c00: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
0c10: 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20  ars) for WinNT. 
0c20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
0c30: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43  mally be.** UNIC
0c40: 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43  ODE_STRING_MAX_C
0c50: 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  HARS..*/.#ifndef
0c60: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
0c70: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0c80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0c90: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  NNT_MAX_PATH_CHA
0ca0: 52 53 20 20 20 28 55 4e 49 43 4f 44 45 5f 53 54  RS   (UNICODE_ST
0cb0: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a  RING_MAX_CHARS).
0cc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0cd0: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
0ce0: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
0cf0: 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 65   for Win32.  The
0d00: 20 4d 41 58 5f 50 41 54 48 20 6d 61 63 72 6f 20   MAX_PATH macro 
0d10: 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74  is in.** charact
0d20: 65 72 73 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63  ers, so we alloc
0d30: 61 74 65 20 34 20 62 79 74 65 73 20 70 65 72 20  ate 4 bytes per 
0d40: 63 68 61 72 61 63 74 65 72 20 61 73 73 75 6d 69  character assumi
0d50: 6e 67 20 77 6f 72 73 74 2d 63 61 73 65 20 6f 66  ng worst-case of
0d60: 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70 65 72 2d  .** 4-bytes-per-
0d70: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 55 54  character for UT
0d80: 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  F8..*/.#ifndef S
0d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0da0: 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65  PATH_BYTES.#  de
0db0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
0dc0: 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
0dd0: 20 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32     (SQLITE_WIN32
0de0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 2a  _MAX_PATH_CHARS*
0df0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0e00: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0e10: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0e20: 65 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20  es) for WinNT.  
0e30: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  This should norm
0e40: 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f  ally be.** UNICO
0e50: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0e60: 41 52 53 20 2a 20 73 69 7a 65 6f 66 28 57 43 48  ARS * sizeof(WCH
0e70: 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  AR)..*/.#ifndef 
0e80: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0e90: 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64  _PATH_BYTES.#  d
0ea0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0eb0: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
0ec0: 53 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  S   \.          
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 28 73 69 7a 65 6f 66 28 57 43 48 41 52 29    (sizeof(WCHAR)
0ef0: 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f   * SQLITE_WINNT_
0f00: 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 29 0a  MAX_PATH_CHARS).
0f10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0f20: 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d 65 73 73  ximum error mess
0f30: 61 67 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63  age length (in c
0f40: 68 61 72 73 29 20 66 6f 72 20 57 69 6e 52 54 2e  hars) for WinRT.
0f50: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0f60: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
0f70: 4d 53 47 5f 43 48 41 52 53 0a 23 20 20 64 65 66  MSG_CHARS.#  def
0f80: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0f90: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
0fa0: 53 20 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a  S (1024).#endif.
0fb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
0fc0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63  on-zero if the c
0fd0: 68 61 72 61 63 74 65 72 20 73 68 6f 75 6c 64 20  haracter should 
0fe0: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 61 20  be treated as a 
0ff0: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70  directory.** sep
1000: 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64  arator..*/.#ifnd
1010: 65 66 20 77 69 6e 49 73 44 69 72 53 65 70 0a 23  ef winIsDirSep.#
1020: 20 20 64 65 66 69 6e 65 20 77 69 6e 49 73 44 69    define winIsDi
1030: 72 53 65 70 28 61 29 20 20 20 20 20 20 20 20 20  rSep(a)         
1040: 20 20 20 20 20 20 20 28 28 28 61 29 20 3d 3d 20         (((a) == 
1050: 27 2f 27 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20  '/') || ((a) == 
1060: 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  '\\')).#endif../
1070: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1080: 69 73 20 75 73 65 64 20 77 68 65 6e 20 61 20 6c  is used when a l
1090: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  ocal variable is
10a0: 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
10b0: 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65  that is.** [some
10c0: 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73 65 64 20  times] not used 
10d0: 62 79 20 74 68 65 20 63 6f 64 65 20 28 65 2e 67  by the code (e.g
10e0: 2e 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61  . via conditiona
10f0: 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a  l compilation)..
1100: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
1110: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1120: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 55 53 45  .#  define UNUSE
1130: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1140: 28 78 29 20 20 20 20 20 20 28 76 6f 69 64 29 28  (x)      (void)(
1150: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
1160: 20 52 65 74 75 72 6e 73 20 74 68 65 20 63 68 61   Returns the cha
1170: 72 61 63 74 65 72 20 74 68 61 74 20 73 68 6f 75  racter that shou
1180: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ld be used as th
1190: 65 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  e directory sepa
11a0: 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rator..*/.#ifnde
11b0: 66 20 77 69 6e 47 65 74 44 69 72 53 65 70 0a 23  f winGetDirSep.#
11c0: 20 20 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44    define winGetD
11d0: 69 72 53 65 70 28 29 20 20 20 20 20 20 20 20 20  irSep()         
11e0: 20 20 20 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64         '\\'.#end
11f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20  if../*.** Do we 
1200: 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79  need to manually
1210: 20 64 65 66 69 6e 65 20 74 68 65 20 57 69 6e 33   define the Win3
1220: 32 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  2 file mapping A
1230: 50 49 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  PIs for use with
1240: 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20   WAL.** mode or 
1250: 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69  memory mapped fi
1260: 6c 65 73 20 28 65 2e 67 2e 20 74 68 65 73 65 20  les (e.g. these 
1270: 41 50 49 73 20 61 72 65 20 61 76 61 69 6c 61 62  APIs are availab
1280: 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  le in the Window
1290: 73 0a 2a 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77  s.** CE SDK; how
12a0: 65 76 65 72 2c 20 74 68 65 79 20 61 72 65 20 6e  ever, they are n
12b0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
12c0: 65 20 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a  e header file)?.
12d0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49  */.#if SQLITE_WI
12e0: 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f  N32_FILEMAPPING_
12f0: 41 50 49 20 26 26 20 5c 0a 20 20 20 20 20 20 20  API && \.       
1300: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
1310: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
1320: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1330: 49 5a 45 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f  IZE>0)./*.** Two
1340: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70   of the file map
1350: 70 69 6e 67 20 41 50 49 73 20 61 72 65 20 64 69  ping APIs are di
1360: 66 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69  fferent under Wi
1370: 6e 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74  nRT.  Figure out
1380: 20 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65   which.** set we
1390: 20 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51   need..*/.#if SQ
13a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49  LITE_OS_WINRT.WI
13b0: 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20  NBASEAPI HANDLE 
13c0: 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c  WINAPI CreateFil
13d0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
13e0: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
13f0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
1400: 52 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20  RIBUTES, ULONG, 
1410: 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52  ULONG64, LPCWSTR
1420: 29 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c  );..WINBASEAPI L
1430: 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70  PVOID WINAPI Map
1440: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1450: 70 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c  p(HANDLE, ULONG,
1460: 20 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54   ULONG64, SIZE_T
1470: 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66  );.#else.#if def
1480: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1490: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42  2_HAS_ANSI).WINB
14a0: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
14b0: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
14c0: 61 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20  appingA(HANDLE, 
14d0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
14e0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
14f0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
1500: 57 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23  WORD, LPCSTR);.#
1510: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1520: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1530: 53 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20  S_ANSI) */..#if 
1540: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1550: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57  IN32_HAS_WIDE).W
1560: 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45  INBASEAPI HANDLE
1570: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
1580: 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c  leMappingW(HANDL
1590: 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54  E, LPSECURITY_AT
15a0: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
15b0: 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44      DWORD, DWORD
15c0: 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52  , DWORD, LPCWSTR
15d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  );.#endif /* def
15e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
15f0: 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a  2_HAS_WIDE) */..
1600: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
1610: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
1620: 4f 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44  OfFile(HANDLE, D
1630: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
1640: 52 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e  RD, SIZE_T);.#en
1650: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
1660: 5f 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINRT */../*.**
1670: 20 54 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69   This file mappi
1680: 6e 67 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e  ng API is common
1690: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
16a0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e  nd WinRT..*/.WIN
16b0: 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e  BASEAPI BOOL WIN
16c0: 41 50 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46  API UnmapViewOfF
16d0: 69 6c 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65  ile(LPCVOID);.#e
16e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
16f0: 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47  IN32_FILEMAPPING
1700: 5f 41 50 49 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  _API */../*.** S
1710: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
1720: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
1730: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
1740: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
1750: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1760: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
1770: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1780: 53 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  S ((DWORD)-1).#e
1790: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17a0: 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64  LE_FLAG_MASK.# d
17b0: 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f  efine FILE_FLAG_
17c0: 4d 41 53 4b 20 20 20 20 20 20 20 20 20 20 28 30  MASK          (0
17d0: 78 46 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69  xFF3C0000).#endi
17e0: 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f  f..#ifndef FILE_
17f0: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23  ATTRIBUTE_MASK.#
1800: 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54   define FILE_ATT
1810: 52 49 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20  RIBUTE_MASK     
1820: 28 30 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e  (0x0003FFF7).#en
1830: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1840: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20  ITE_OMIT_WAL./* 
1850: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1860: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 73  es to structures
1870: 20 75 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f   used for WAL */
1880: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1890: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
18b0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
18c0: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
18d0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
18e0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
18f0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
1900: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1910: 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y */.#endif../*.
1920: 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e  ** WinCE lacks n
1930: 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f  ative support fo
1940: 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73  r file locking s
1950: 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b  o we have to fak
1960: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d  e it.** with som
1970: 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77  e code of our ow
1980: 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  n..*/.#if SQLITE
1990: 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65  _OS_WINCE.typede
19a0: 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f  f struct winceLo
19b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64  ck {.  int nRead
19c0: 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  ers;       /* Nu
19d0: 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c  mber of reader l
19e0: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f  ocks obtained */
19f0: 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67  .  BOOL bPending
1a00: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ;      /* Indica
1a10: 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  tes a pending lo
1a20: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
1a30: 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  ined */.  BOOL b
1a40: 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a  Reserved;     /*
1a50: 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73   Indicates a res
1a60: 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62  erved lock has b
1a70: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  een obtained */.
1a80: 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76    BOOL bExclusiv
1a90: 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74  e;    /* Indicat
1aa0: 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  es an exclusive 
1ab0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1ac0: 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63  tained */.} winc
1ad0: 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f  eLock;.#endif../
1ae0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65  *.** The winFile
1af0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
1b00: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
1b10: 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66  te3_file* specif
1b20: 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a  ic to the win32.
1b30: 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c  ** portability l
1b40: 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ayer..*/.typedef
1b50: 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20   struct winFile 
1b60: 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  winFile;.struct 
1b70: 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73  winFile {.  cons
1b80: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1b90: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f  hods *pMethod; /
1ba0: 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73  *** Must be firs
1bb0: 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33  t ***/.  sqlite3
1bc0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
1bd0: 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64   /* The VFS used
1be0: 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69   to open this fi
1bf0: 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68  le */.  HANDLE h
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c10: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63  /* Handle for ac
1c20: 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65  cessing the file
1c30: 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70   */.  u8 locktyp
1c40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1c50: 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75   Type of lock cu
1c60: 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20  rrently held on 
1c70: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73  this file */.  s
1c80: 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42  hort sharedLockB
1c90: 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d  yte;   /* Random
1ca0: 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75  ly chosen byte u
1cb0: 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20  sed as a shared 
1cc0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72  lock */.  u8 ctr
1cd0: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
1ce0: 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65    /* Flags.  See
1cf0: 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77   WINFILE_* below
1d00: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
1d10: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a  Errno;        /*
1d20: 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72   The Windows err
1d30: 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74  no from the last
1d40: 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69   I/O error */.#i
1d50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d60: 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a  T_WAL.  winShm *
1d70: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1d80: 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73  /* Instance of s
1d90: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20  hared memory on 
1da0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  this file */.#en
1db0: 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dif.  const char
1dc0: 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a   *zPath;      /*
1dd0: 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   Full pathname o
1de0: 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  f this file */. 
1df0: 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20   int szChunk;   
1e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e           /* Chun
1e10: 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65  k size configure
1e20: 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b  d by FCNTL_CHUNK
1e30: 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c  _SIZE */.#if SQL
1e40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c  ITE_OS_WINCE.  L
1e50: 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43  PWSTR zDeleteOnC
1e60: 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  lose;  /* Name o
1e70: 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
1e80: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
1e90: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78  .  HANDLE hMutex
1ea0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  ;          /* Mu
1eb0: 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74  tex used to cont
1ec0: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68  rol access to sh
1ed0: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 48  ared lock */.  H
1ee0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
1ef0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1f00: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
1f10: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1f20: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1f30: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
1f40: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
1f50: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
1f60: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
1f70: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
1f80: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
1f90: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
1fa0: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
1fb0: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  le  */.#endif.#i
1fc0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1fd0: 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e  P_SIZE>0.  int n
1fe0: 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20  FetchOut;       
1ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2000: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
2010: 67 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  g xFetch referen
2020: 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ces */.  HANDLE 
2030: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
2040: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
2050: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d   for accessing m
2060: 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f  emory mapping */
2070: 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67  .  void *pMapReg
2080: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
2090: 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20   /* Area memory 
20a0: 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69  mapped */.  sqli
20b0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
20c0: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61  ze;       /* Usa
20d0: 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ble size of mapp
20e0: 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  ed region */.  s
20f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
2100: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20  pSizeActual; /* 
2110: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
2120: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
2130: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2140: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
2150: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43  /* Configured FC
2160: 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61  NTL_MMAP_SIZE va
2170: 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
2180: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
2190: 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69  values for winFi
21a0: 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a  le.ctrlFlags.*/.
21b0: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
21c0: 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20  RDONLY          
21d0: 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  0x02   /* Connec
21e0: 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c  tion is read onl
21f0: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  y */.#define WIN
2200: 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
2210: 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50       0x04   /* P
2220: 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f  ersistent WAL mo
2230: 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  de */.#define WI
2240: 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20  NFILE_PSOW      
2250: 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20        0x10   /* 
2260: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
2270: 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2280: 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73   */../*. * The s
2290: 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
22a0: 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  r used by sqlite
22b0: 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65  3_win32_write_de
22c0: 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64  bug().. */.#ifnd
22d0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
22e0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20  DBG_BUF_SIZE.#  
22f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2300: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
2310: 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73     ((int)(4096-s
2320: 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23  izeof(DWORD))).#
2330: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2340: 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68   value used with
2350: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
2360: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74  et_directory() t
2370: 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20  o specify that. 
2380: 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  * the data direc
2390: 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63  tory should be c
23a0: 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e  hanged.. */.#ifn
23b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
23c0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
23d0: 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53  TYPE.#  define S
23e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
23f0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
2400: 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (1).#endif../*. 
2410: 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65 64  * The value used
2420: 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69   with sqlite3_wi
2430: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
2440: 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20 74  y() to specify t
2450: 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f  hat. * the tempo
2460: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 73  rary directory s
2470: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2480: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2490: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
24a0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
24b0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
24c0: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
24d0: 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65  TORY_TYPE (2).#e
24e0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  ndif../*. * If c
24f0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
2500: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
2510: 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20   on Windows, we 
2520: 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20  will use the. * 
2530: 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50  various Win32 AP
2540: 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73  I heap functions
2550: 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20   instead of our 
2560: 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20  own.. */.#ifdef 
2570: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
2580: 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68  LOC../*. * If th
2590: 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  is is non-zero, 
25a0: 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  an isolated heap
25b0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
25c0: 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20 57   by the native W
25d0: 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f  in32. * allocato
25e0: 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68  r subsystem; oth
25f0: 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66 61  erwise, the defa
2600: 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61 70  ult process heap
2610: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20   will be used.  
2620: 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20  This. * setting 
2630: 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68  has no effect wh
2640: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72  en compiling for
2650: 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61   WinRT.  By defa
2660: 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61  ult, this is ena
2670: 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69  bled. * and an i
2680: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2690: 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f 20  l be created to 
26a0: 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61  store all alloca
26b0: 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a  ted data.. *. **
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20  ************. * 
2710: 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69  WARNING: It is i
2720: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65  mportant to note
2730: 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
2740: 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a  setting is non-z
2750: 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20  ero and the. *  
2760: 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68          winMemSh
2770: 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20  utdown function 
2780: 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20  is called (e.g. 
2790: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73  by the sqlite3_s
27a0: 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20  hutdown. *      
27b0: 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61      function), a
27c0: 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ll data that was
27d0: 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
27e0: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65   the isolated he
27f0: 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  ap will. *      
2800: 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d      be freed imm
2810: 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79  ediately and any
2820: 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65   attempt to acce
2830: 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66  ss any of that f
2840: 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20  reed. *         
2850: 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73   data will almos
2860: 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75  t certainly resu
2870: 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61  lt in an immedia
2880: 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74  te access violat
2890: 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.. **********
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e0: 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ****. */.#ifndef
28f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2900: 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66  AP_CREATE.#  def
2910: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2920: 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20 20  _HEAP_CREATE    
2930: 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f  (TRUE).#endif../
2940: 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c  *. * The initial
2950: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e   size of the Win
2960: 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70  32-specific heap
2970: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2980: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2990: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
29a0: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
29b0: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
29c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
29d0: 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54  NIT_SIZE ((SQLIT
29e0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
29f0: 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20  SIZE) * \.      
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
2a30: 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31  _PAGE_SIZE) + 41
2a40: 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f  94304).#endif../
2a50: 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *. * The maximum
2a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e   size of the Win
2a70: 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61 70  32-specific heap
2a80: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2a90: 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23  y be zero.. */.#
2aa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
2ab0: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
2ac0: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2ad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
2ae0: 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64  X_SIZE  (0).#end
2af0: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78  if../*. * The ex
2b00: 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65  tra flags to use
2b10: 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65   in calls to the
2b20: 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49 73   Win32 heap APIs
2b30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
2b40: 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72  y be. * zero for
2b50: 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68   the default beh
2b60: 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64  avior.. */.#ifnd
2b70: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2b80: 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65  HEAP_FLAGS.#  de
2b90: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2ba0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20  2_HEAP_FLAGS    
2bb0: 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   (0).#endif.../*
2bc0: 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61  .** The winMemDa
2bd0: 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f  ta structure sto
2be0: 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  res information 
2bf0: 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
2c00: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a  Win32-specific.*
2c10: 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  * sqlite3_mem_me
2c20: 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61  thods implementa
2c30: 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tion..*/.typedef
2c40: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
2c50: 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73  ta winMemData;.s
2c60: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
2c70: 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   {.#ifndef NDEBU
2c80: 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20  G.  u32 magic1; 
2c90: 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
2ca0: 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75  r to detect stru
2cb0: 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
2cc0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41  . */.#endif.  HA
2cd0: 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54  NDLE hHeap; /* T
2ce0: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72  he handle to our
2cf0: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c   heap. */.  BOOL
2d00: 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20   bOwned;  /* Do 
2d10: 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20  we own the heap 
2d20: 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74  (i.e. destroy it
2d30: 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a   on shutdown)? *
2d40: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
2d50: 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20  .  u32 magic2;  
2d60: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
2d70: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
2d80: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
2d90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23   */.#endif.};..#
2da0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64  ifndef NDEBUG.#d
2db0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
2dc0: 49 43 31 20 20 20 20 20 30 78 34 32 62 32 38 33  IC1     0x42b283
2dd0: 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45  0b.#define WINME
2de0: 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78 62  M_MAGIC2     0xb
2df0: 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a  d4d7cf4.#endif..
2e00: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
2e10: 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d  nMemData win_mem
2e20: 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65  _data = {.#ifnde
2e30: 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45  f NDEBUG.  WINME
2e40: 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66  M_MAGIC1,.#endif
2e50: 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23  .  NULL, FALSE.#
2e60: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2e70: 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23  ,WINMEM_MAGIC2.#
2e80: 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65  endif.};..#ifnde
2e90: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
2ea0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2eb0: 69 63 31 28 29 20 61 73 73 65 72 74 28 20 77 69  ic1() assert( wi
2ec0: 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63  n_mem_data.magic
2ed0: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
2ee0: 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65   ).#define winMe
2ef0: 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 20  mAssertMagic2() 
2f00: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
2f10: 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e  data.magic2==WIN
2f20: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65  MEM_MAGIC2 ).#de
2f30: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2f40: 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d  tMagic()  winMem
2f50: 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20  AssertMagic1(); 
2f60: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2f70: 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66  c2();.#else.#def
2f80: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
2f90: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
2fa0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2fb0: 74 44 61 74 61 50 74 72 28 29 20 20 26 77 69 6e  tDataPtr()  &win
2fc0: 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e  _mem_data.#defin
2fd0: 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  e winMemGetHeap(
2fe0: 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61  )     win_mem_da
2ff0: 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65  ta.hHeap.#define
3000: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
3010: 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  )    win_mem_dat
3020: 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63  a.bOwned..static
3030: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
3040: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b  loc(int nBytes);
3050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
3060: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
3070: 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f  rior);.static vo
3080: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
3090: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
30a0: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
30b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
30c0: 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61  ze(void *p);.sta
30d0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
30e0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74  undup(int n);.st
30f0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
3100: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
3110: 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ta);.static void
3120: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
3130: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
3140: 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  ..const sqlite3_
3150: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
3160: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
3170: 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  void);.#endif /*
3180: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
3190: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
31a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
31b0: 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c  iable is (normal
31c0: 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64  ly) set once and
31d0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a   never changes.*
31e0: 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49  * thereafter.  I
31f0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
3200: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  r the operating 
3210: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a  system is Win9x.
3220: 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  ** or WinNT..**.
3230: 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 0:   Operatin
3240: 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e  g system unknown
3250: 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74  ..** 1:   Operat
3260: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
3270: 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65  n9x..** 2:   Ope
3280: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
3290: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e   WinNT..**.** In
32a0: 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69   order to facili
32b0: 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20  tate testing on 
32c0: 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20  a WinNT system, 
32d0: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
32e0: 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79  .** can manually
32f0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
3300: 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20  to 1 to emulate 
3310: 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a  Win98 behavior..
3320: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3330: 5f 54 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54  _TEST.LONG SQLIT
3340: 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45  E_WIN32_VOLATILE
3350: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
3360: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74   = 0;.#else.stat
3370: 69 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57  ic LONG SQLITE_W
3380: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71  IN32_VOLATILE sq
3390: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
33a0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
33b0: 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65  ef SYSCALL.#  de
33c0: 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c  fine SYSCALL sql
33d0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
33e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
33f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3400: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  not available on
3410: 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57   Windows CE or W
3420: 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53  inRT.. */..#if S
3430: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
3440: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
3450: 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72  T.#  define osAr
3460: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
3470: 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a        1.#endif..
3480: 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65  /*.** Many syste
3490: 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65  m calls are acce
34a0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69  ssed through poi
34b0: 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e  nter-to-function
34c0: 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  s so that.** the
34d0: 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  y may be overrid
34e0: 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74  den at runtime t
34f0: 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75  o facilitate fau
3500: 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72  lt injection dur
3510: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  ing.** testing a
3520: 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20  nd sandboxing.  
3530: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  The following ar
3540: 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  ray holds the na
3550: 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73  mes and pointers
3560: 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72  .** to all overr
3570: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
3580: 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alls..*/.static 
3590: 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61  struct win_sysca
35a0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
35b0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
35c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35d0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
35e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
35f0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3600: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3610: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3620: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3630: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3640: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3650: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3660: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
3670: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3680: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
3690: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
36a0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
36b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
36c0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
36d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
36e0: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
36f0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
3700: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3730: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
3740: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
3750: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
3760: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
3770: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
3780: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
3790: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
37a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
37b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37c0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
37d0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
37e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
37f0: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
3800: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3810: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3820: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
3830: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3840: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3860: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3870: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
3880: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
3890: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
38a0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
38b0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
38c0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
38d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
38e0: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
38f0: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3900: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
3910: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
3920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3930: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
3940: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3950: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3970: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3980: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
3990: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
39a0: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
39b0: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
39c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
39d0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
39e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
39f0: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
3a00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
3a10: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
3a20: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
3a30: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
3a40: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
3a50: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3a60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3a70: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
3a80: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3aa0: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3ac0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3ad0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
3ae0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3b10: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3b20: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
3b30: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
3b40: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
3b50: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
3b60: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
3b70: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
3b80: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3b90: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3ba0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
3bb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3bc0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3bd0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3bf0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
3c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3c10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3c20: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
3c30: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3c40: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3c50: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c60: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3c70: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
3c80: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
3c90: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
3ca0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
3cb0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3cc0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
3cd0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3ce0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
3cf0: 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  if (!SQLITE_OS_W
3d00: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3d10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3d20: 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20  _ANSI) && \.    
3d30: 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
3d40: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
3d50: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
3d60: 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22  P_SIZE>0)).  { "
3d70: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3d80: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
3d90: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
3da0: 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  pingA,      0 },
3db0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
3dc0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c  teFileMappingA",
3dd0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3df0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3e00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3e10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
3e20: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3e30: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
3e40: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3e50: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3e60: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
3e70: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36  CSTR))aSyscall[6
3e80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3e90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3ea0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
3eb0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3ec0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3ed0: 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20  S_WIDE) && \.   
3ee0: 20 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53       (!defined(S
3ef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
3f00: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
3f10: 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20  AP_SIZE>0)).  { 
3f20: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3f30: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
3f40: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
3f50: 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  ppingW,      0 }
3f60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3f70: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3f80: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3f90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3fa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3fb0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3fc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3fd0: 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  gW ((HANDLE(WINA
3fe0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45  PI*)(HANDLE,LPSE
3ff0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4000: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
4010: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  RD,DWORD,DWORD,L
4020: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4030: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [7].pCurrent)..#
4040: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4050: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4070: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
4080: 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20  eMutexW",       
4090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
40a0: 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20  eateMutexW,     
40b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
40c0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  e.  { "CreateMut
40d0: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
40e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4110: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
4120: 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28  MutexW ((HANDLE(
4130: 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52  WINAPI*)(LPSECUR
4140: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42  ITY_ATTRIBUTES,B
4150: 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  OOL, \.        L
4160: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4170: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
4180: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
41a0: 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  ).  { "DeleteFil
41b0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
41c0: 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65   (SYSCALL)Delete
41d0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
41e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
41f0: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4240: 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  ine osDeleteFile
4250: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4260: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4270: 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[9].pCurrent).
4280: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4290: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
42a0: 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  DE).  { "DeleteF
42b0: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
42c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
42d0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
42e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
42f0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4310: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4340: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4350: 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leW ((BOOL(WINAP
4360: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
4370: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
4380: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4390: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
43a0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
43b0: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
43c0: 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  )FileTimeToLocal
43d0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
43e0: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
43f0: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4400: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4430: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
4440: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4450: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
4460: 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54  PI*)(CONST FILET
4470: 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20  IME*, \.        
4480: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
4490: 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e  call[11].pCurren
44a0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
44b0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
44c0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
44d0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
44e0: 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
44f0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65  Time,    0 },.#e
4500: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4510: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4520: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4550: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
4560: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4570: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4580: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4590: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  , \.        LPSY
45a0: 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61  STEMTIME))aSysca
45b0: 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[12].pCurrent)
45c0: 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65  ..  { "FlushFile
45d0: 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20  Buffers",       
45e0: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46   (SYSCALL)FlushF
45f0: 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20  ileBuffers,     
4600: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4610: 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
4620: 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ers ((BOOL(WINAP
4630: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
4640: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
4650: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4660: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4670: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d  _ANSI).  { "Form
4680: 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20  atMessageA",    
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
46a0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20  ormatMessageA,  
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
46c0: 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  se.  { "FormatMe
46d0: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
46e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4710: 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61  .#define osForma
4720: 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52  tMessageA ((DWOR
4730: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
4740: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44  ,LPCVOID,DWORD,D
4750: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
4760: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4770: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
4780: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4790: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
47a0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
47b0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
47c0: 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ageW",          
47d0: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
47e0: 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20  essageW,        
47f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4800: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4810: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4820: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4840: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4850: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
4860: 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geW ((DWORD(WINA
4870: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
4880: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
4890: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
48a0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
48b0: 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43  )aSyscall[15].pC
48c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65  urrent)..#if !de
48d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
48e0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
48f0: 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61  ).  { "FreeLibra
4900: 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ry",            
4910: 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69   (SYSCALL)FreeLi
4920: 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20  brary,          
4930: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4940: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4990: 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ine osFreeLibrar
49a0: 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  y ((BOOL(WINAPI*
49b0: 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63  )(HMODULE))aSysc
49c0: 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74  all[16].pCurrent
49d0: 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65  )..  { "GetCurre
49e0: 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20  ntProcessId",   
49f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75    (SYSCALL)GetCu
4a00: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20  rrentProcessId, 
4a10: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
4a20: 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  e osGetCurrentPr
4a30: 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28  ocessId ((DWORD(
4a40: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
4a50: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
4a60: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4a70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4a80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4a90: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4aa0: 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70  { "GetDiskFreeSp
4ab0: 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59  aceA",       (SY
4ac0: 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65  SCALL)GetDiskFre
4ad0: 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30  eSpaceA,       0
4ae0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4af0: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4b00: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4b10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4b20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4b30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4b40: 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  osGetDiskFreeSpa
4b50: 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ceA ((BOOL(WINAP
4b60: 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f  I*)(LPCSTR,LPDWO
4b70: 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  RD,LPDWORD,LPDWO
4b80: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
4b90: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
4ba0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  18].pCurrent)..#
4bb0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4bc0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4bd0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4be0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4bf0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4c00: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c10: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4c20: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4c30: 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceW,       0 },.
4c40: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4c50: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4c60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4c90: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ca0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20  tDiskFreeSpaceW 
4cb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4cc0: 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c  LPCWSTR,LPDWORD,
4cd0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4ce0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4cf0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d  RD))aSyscall[19]
4d00: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4d10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4d20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4d30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4d40: 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53  butesA",      (S
4d50: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4d60: 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20  tributesA,      
4d70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4d80: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4d90: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4da0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4dc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4dd0: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4de0: 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49  utesA ((DWORD(WI
4df0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
4e00: 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72  Syscall[20].pCur
4e10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4e20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4e30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4e40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4e50: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
4e60: 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59  utesW",      (SY
4e70: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
4e80: 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30  ributesW,      0
4e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4ea0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4eb0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4ef0: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
4f00: 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e  tesW ((DWORD(WIN
4f10: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4f20: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
4f30: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4f40: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4f50: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4f60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f70: 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ExW",    (SYSCAL
4f80: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4f90: 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a  tesExW,    0 },.
4fa0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4fb0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4fc0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ff0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5000: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
5010: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
5020: 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46  *)(LPCWSTR,GET_F
5030: 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c  ILEEX_INFO_LEVEL
5040: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56  S, \.        LPV
5050: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32  OID))aSyscall[22
5060: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5070: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5080: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69  T.  { "GetFileSi
5090: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
50a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
50b0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
50c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
50d0: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
50f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5110: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5120: 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  ine osGetFileSiz
5130: 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  e ((DWORD(WINAPI
5140: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52  *)(HANDLE,LPDWOR
5150: 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  D))aSyscall[23].
5160: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5170: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5180: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5190: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
51a0: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
51b0: 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20  thNameA",       
51c0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
51d0: 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20  lPathNameA,     
51e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
51f0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5200: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5210: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5230: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5240: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5250: 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57  hNameA ((DWORD(W
5260: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
5270: 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20  WORD,LPSTR, \.  
5280: 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53        LPSTR*))aS
5290: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
52a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
52b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
52c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
52d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
52e0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
52f0: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5300: 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20  hNameW",        
5310: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5320: 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20  PathNameW,      
5330: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5340: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5350: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5360: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5380: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5390: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
53a0: 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49  NameW ((DWORD(WI
53b0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
53c0: 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  WORD,LPWSTR, \. 
53d0: 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29         LPWSTR*))
53e0: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
53f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5400: 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20  LastError",     
5410: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5420: 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
5430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5440: 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74  define osGetLast
5450: 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49  Error ((DWORD(WI
5460: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
5470: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
5480: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
5490: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
54a0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69  AD_EXTENSION).#i
54b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
54c0: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
54d0: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
54e0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
54f0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
5500: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
5510: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5520: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5530: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
5540: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
5550: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
5560: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
5570: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
5580: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
5590: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
55a0: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
55b0: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
55c0: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
55d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
55e0: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
55f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
5600: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c   0 },.#endif.#el
5620: 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  se.  { "GetProcA
5630: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5670: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
5680: 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52  ocAddressA ((FAR
5690: 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d  PROC(WINAPI*)(HM
56a0: 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ODULE, \.       
56b0: 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c   LPCSTR))aSyscal
56c0: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
56d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
56e0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79  WINRT.  { "GetSy
56f0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20  stemInfo",      
5700: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5710: 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20  tSystemInfo,    
5720: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5730: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5740: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5750: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5780: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5790: 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57  temInfo ((VOID(W
57a0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
57b0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
57c0: 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  28].pCurrent).. 
57d0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
57e0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
57f0: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
5800: 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Time,           
5810: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5820: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28  GetSystemTime ((
5830: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
5840: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
5850: 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e  call[29].pCurren
5860: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5870: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65  OS_WINCE.  { "Ge
5880: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
5890: 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c  eTime", (SYSCALL
58a0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  )GetSystemTimeAs
58b0: 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23  FileTime, 0 },.#
58c0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73  else.  { "GetSys
58d0: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
58e0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5910: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5920: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5930: 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41  Time ((VOID(WINA
5940: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
5950: 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73  LPFILETIME))aSys
5960: 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e  call[30].pCurren
5970: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
5980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5990: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54  _ANSI).  { "GetT
59a0: 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20  empPathA",      
59b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
59c0: 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20  etTempPathA,    
59d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
59e0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
59f0: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5a30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5a40: 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28  mpPathA ((DWORD(
5a50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5a60: 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  PSTR))aSyscall[3
5a70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
5a80: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5a90: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
5aa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5ab0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d  IDE).  { "GetTem
5ac0: 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20  pPathW",        
5ad0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5ae0: 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20  TempPathW,      
5af0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5b00: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5b10: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5b20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5b50: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70  define osGetTemp
5b60: 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49  PathW ((DWORD(WI
5b70: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57  NAPI*)(DWORD,LPW
5b80: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32  STR))aSyscall[32
5b90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ba0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5bb0: 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f  T.  { "GetTickCo
5bc0: 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
5bd0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63   (SYSCALL)GetTic
5be0: 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20  kCount,         
5bf0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5c00: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5c20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5c40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5c50: 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  ine osGetTickCou
5c60: 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  nt ((DWORD(WINAP
5c70: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
5c80: 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[33].pCurrent)
5c90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
5cb0: 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28  NSI) && defined(
5cc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5cd0: 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a  VERSIONEX) && \.
5ce0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
5cf0: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
5d00: 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  X.  { "GetVersio
5d10: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
5d20: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
5d30: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
5d40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5d50: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5d60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5d90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5da0: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
5db0: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
5dc0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5dd0: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
5de0: 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43  )aSyscall[34].pC
5df0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5e00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5e10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5e20: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
5e30: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65 66  && \.        def
5e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5e50: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
5e60: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
5e70: 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b  GETVERSIONEX.  {
5e80: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
5e90: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5ea0: 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45  CALL)GetVersionE
5eb0: 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  xW,           0 
5ec0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5ed0: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5ee0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5ef0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5f00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5f10: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5f20: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28  sGetVersionExW (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45  \.        LPOSVE
5f50: 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73  RSIONINFOW))aSys
5f60: 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e  call[35].pCurren
5f70: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c  t)..  { "HeapAll
5f80: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
5f90: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5fa0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
5fb0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5fc0: 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28  ne osHeapAlloc (
5fd0: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
5fe0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
5ff0: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6000: 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43  )aSyscall[36].pC
6010: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6020: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6030: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6050: 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65  SCALL)HeapCreate
6060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6070: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6080: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
6090: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
60a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
60b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
60c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
60d0: 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48  osHeapCreate ((H
60e0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44  ANDLE(WINAPI*)(D
60f0: 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20  WORD,SIZE_T, \. 
6100: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6110: 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72  Syscall[37].pCur
6120: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6130: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6140: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6150: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6160: 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c  ALL)HeapDestroy,
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6180: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
6190: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
61a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
61c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
61e0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f  HeapDestroy ((BO
61f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6200: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d  LE))aSyscall[38]
6210: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6220: 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20  "HeapFree",     
6230: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6240: 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20  ALL)HeapFree,   
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6260: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6270: 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e  pFree ((BOOL(WIN
6280: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6290: 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63  RD,LPVOID))aSysc
62a0: 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74  all[39].pCurrent
62b0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c  )..  { "HeapReAl
62c0: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
62d0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52    (SYSCALL)HeapR
62e0: 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  eAlloc,         
62f0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6300: 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20  e osHeapReAlloc 
6310: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
6320: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6330: 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20  PVOID, \.       
6340: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
6350: 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[40].pCurrent).
6360: 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c  .  { "HeapSize",
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6380: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a  (SYSCALL)HeapSiz
6390: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
63a0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
63b0: 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a  osHeapSize ((SIZ
63c0: 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  E_T(WINAPI*)(HAN
63d0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
63e0: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
63f0: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
6400: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6410: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6420: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6430: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6440: 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c  LL)HeapValidate,
6450: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6460: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
6470: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
6480: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
64b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
64c0: 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f  eapValidate ((BO
64d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
64e0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
64f0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6500: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
6510: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6520: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6540: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6560: 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63  SCALL)HeapCompac
6570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  t,             0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6590: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
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 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28  osHeapCompact ((
65f0: 55 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41  UINT(WINAPI*)(HA
6600: 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73  NDLE,DWORD))aSys
6610: 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e  call[43].pCurren
6620: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6640: 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e  _ANSI) && !defin
6650: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
6660: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
6670: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6690: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
66a0: 72 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryA,            
66b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
66c0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
66d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
66e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6700: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6710: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20   osLoadLibraryA 
6720: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
6730: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
6740: 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74  all[44].pCurrent
6750: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6760: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
6770: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6780: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
6790: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
67a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
67b0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
67c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
67d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67e0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57  ALL)LoadLibraryW
67f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6800: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6810: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6850: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6860: 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48  LoadLibraryW ((H
6870: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6880: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
6890: 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[45].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c  WINRT.  { "Local
68c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
68d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
68e0: 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20  calFree,        
68f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6900: 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  e.  { "LocalFree
6910: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6920: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6950: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46  #define osLocalF
6960: 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e  ree ((HLOCAL(WIN
6970: 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53  API*)(HLOCAL))aS
6980: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
6990: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
69a0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
69b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
69c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
69e0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c  YSCALL)LockFile,
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6a10: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6a20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a30: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a50: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6a60: 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66   osLockFile.#def
6a70: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28  ine osLockFile (
6a80: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6a90: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6aa0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
6ab0: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6ac0: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
6ad0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
6ae0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
6af0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6b10: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78  SCALL)LockFileEx
6b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6b30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6b40: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6b50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6b70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6b80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6b90: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65  osLockFileEx.#de
6ba0: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  fine osLockFileE
6bb0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6bc0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
6bd0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6be0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
6bf0: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
6c00: 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[48].pCurrent)
6c10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
6c20: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
6c30: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
6c40: 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  T && \.        (
6c50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6c60: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
6c70: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
6c80: 45 3e 30 29 29 0a 20 20 7b 20 22 4d 61 70 56 69  E>0)).  { "MapVi
6c90: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
6ca0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61       (SYSCALL)Ma
6cb0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
6cc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6cd0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
6ce0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6cf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6d20: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
6d30: 77 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44  wOfFile ((LPVOID
6d40: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6d50: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
6d60: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
6d70: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
6d80: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
6d90: 7b 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  { "MultiByteToWi
6da0: 64 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59  deChar",     (SY
6db0: 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54  SCALL)MultiByteT
6dc0: 6f 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30  oWideChar,     0
6dd0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d   },..#define osM
6de0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
6df0: 61 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  ar ((int(WINAPI*
6e00: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
6e10: 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20  STR,int,LPWSTR, 
6e20: 5c 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61  \.        int))a
6e30: 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72  Syscall[50].pCur
6e40: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72  rent)..  { "Quer
6e50: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
6e60: 74 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51  ter", (SYSCALL)Q
6e70: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
6e80: 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64  ounter, 0 },..#d
6e90: 65 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72  efine osQueryPer
6ea0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20  formanceCounter 
6eb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6ec0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45   \.        LARGE
6ed0: 5f 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63  _INTEGER*))aSysc
6ee0: 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74  all[51].pCurrent
6ef0: 29 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65  )..  { "ReadFile
6f00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6f10: 20 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46    (SYSCALL)ReadF
6f20: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
6f30: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6f40: 65 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42  e osReadFile ((B
6f50: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6f60: 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  DLE,LPVOID,DWORD
6f70: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
6f80: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
6f90: 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70  ))aSyscall[52].p
6fa0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
6fb0: 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20  etEndOfFile",   
6fc0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6fd0: 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20  L)SetEndOfFile, 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ff0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e  .#define osSetEn
7000: 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  dOfFile ((BOOL(W
7010: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
7020: 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75  aSyscall[53].pCu
7030: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7040: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7050: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7060: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7070: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
7080: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20  ter,          0 
7090: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
70a0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
70b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
70c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
70d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
70e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
70f0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20  sSetFilePointer 
7100: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
7110: 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f  (HANDLE,LONG,PLO
7120: 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  NG, \.        DW
7130: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34  ORD))aSyscall[54
7140: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7150: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7160: 54 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  T.  { "Sleep",  
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c   (SYSCALL)Sleep,
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
71b0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
71d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
71f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7200: 69 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f  ine osSleep ((VO
7210: 49 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  ID(WINAPI*)(DWOR
7220: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e  D))aSyscall[55].
7230: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7240: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
7250: 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41  Time",    (SYSCA
7260: 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  LL)SystemTimeToF
7270: 69 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c  ileTime,    0 },
7280: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74  ..#define osSyst
7290: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
72a0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
72b0: 28 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d  (CONST SYSTEMTIM
72c0: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
72d0: 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61  FILETIME))aSysca
72e0: 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[56].pCurrent)
72f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7300: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
7310: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7320: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
7330: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7340: 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20  LL)UnlockFile,  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7360: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
7370: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
7380: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
73a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
73b0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55  dif..#ifndef osU
73c0: 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e  nlockFile.#defin
73d0: 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28  e osUnlockFile (
73e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
73f0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
7400: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7410: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
7420: 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[57].pCurrent)
7430: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
7440: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
7450: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
7460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7470: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
7480: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  Ex,            0
7490: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
74a0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
74b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
74c0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
74d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
74e0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
74f0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28  osUnlockFileEx (
7500: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7510: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
7520: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
7530: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
7540: 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43  )aSyscall[58].pC
7550: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7560: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
7570: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7580: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
7590: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
75a0: 45 3e 30 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  E>0.  { "UnmapVi
75b0: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
75c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61     (SYSCALL)Unma
75d0: 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20  pViewOfFile,    
75e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
75f0: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7600: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7610: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7640: 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65  efine osUnmapVie
7650: 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  wOfFile ((BOOL(W
7660: 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29  INAPI*)(LPCVOID)
7670: 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43  )aSyscall[59].pC
7680: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69  urrent)..  { "Wi
7690: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
76a0: 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  e",     (SYSCALL
76b0: 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  )WideCharToMulti
76c0: 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  Byte,     0 },..
76d0: 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68  #define osWideCh
76e0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28  arToMultiByte ((
76f0: 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e  int(WINAPI*)(UIN
7700: 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c  T,DWORD,LPCWSTR,
7710: 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c  int,LPSTR,int, \
7720: 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c  .        LPCSTR,
7730: 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c  LPBOOL))aSyscall
7740: 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [60].pCurrent)..
7750: 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c    { "WriteFile",
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7770: 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c  SYSCALL)WriteFil
7780: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7790: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
77a0: 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f  sWriteFile ((BOO
77b0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
77c0: 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  E,LPCVOID,DWORD,
77d0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
77e0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
77f0: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
7800: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7810: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7820: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
7830: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7840: 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74  CALL)CreateEvent
7850: 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  ExW,          0 
7860: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
7870: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7880: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7890: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
78a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
78b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
78c0: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20  sCreateEventExW 
78d0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
78e0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
78f0: 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c  RIBUTES,LPCWSTR,
7900: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
7910: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
7920: 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [62].pCurrent)..
7930: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7940: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
7950: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
7960: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69      (SYSCALL)Wai
7970: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
7980: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
7990: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
79a0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
79b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
79e0: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
79f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44  SingleObject ((D
7a00: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7a10: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
7a20: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7a30: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
7a40: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7a50: 4e 43 45 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NCE.  { "WaitFor
7a60: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
7a70: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
7a80: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
7a90: 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  x,   0 },.#else.
7aa0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7ab0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7ac0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7af0: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
7b00: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28  ingleObjectEx ((
7b10: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
7b20: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
7b30: 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79         BOOL))aSy
7b40: 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65  scall[64].pCurre
7b50: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7b60: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
7b70: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7b80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7b90: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  )SetFilePointerE
7ba0: 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  x,        0 },.#
7bb0: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7bc0: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7bd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7c00: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7c10: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28  FilePointerEx ((
7c20: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
7c30: 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47  NDLE,LARGE_INTEG
7c40: 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c  ER, \.        PL
7c50: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f  ARGE_INTEGER,DWO
7c60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  RD))aSyscall[65]
7c70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7c80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7c90: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
7ca0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7cb0: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  x", (SYSCALL)Get
7cc0: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7cd0: 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a  yHandleEx, 0 },.
7ce0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
7cf0: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7d00: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
7d10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7d30: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
7d40: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
7d50: 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f  ByHandleEx ((BOO
7d60: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7d70: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c  E, \.        FIL
7d80: 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45  E_INFO_BY_HANDLE
7d90: 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57  _CLASS,LPVOID,DW
7da0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36  ORD))aSyscall[66
7db0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7dc0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7dd0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
7de0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
7df0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
7e00: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d  P_SIZE>0).  { "M
7e10: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
7e20: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
7e30: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  L)MapViewOfFileF
7e40: 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a  romApp,    0 },.
7e50: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
7e60: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
7e70: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7ea0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
7eb0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7ec0: 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  pp ((LPVOID(WINA
7ed0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e  PI*)(HANDLE,ULON
7ee0: 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20  G,ULONG64, \.   
7ef0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
7f00: 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65  scall[67].pCurre
7f10: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7f20: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7f30: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
7f40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7f50: 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20  )CreateFile2,   
7f60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7f70: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7f80: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
7f90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7fc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7fd0: 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c  ateFile2 ((HANDL
7fe0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
7ff0: 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  TR,DWORD,DWORD,D
8000: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
8010: 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  LPCREATEFILE2_EX
8020: 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
8030: 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e  S))aSyscall[68].
8040: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
8050: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8060: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
8070: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
8080: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
8090: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
80a0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c  ,     (SYSCALL)L
80b0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
80c0: 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ry,     0 },.#el
80d0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  se.  { "LoadPack
80e0: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
80f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8120: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50  .#define osLoadP
8130: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28  ackagedLibrary (
8140: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
8150: 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  )(LPCWSTR, \.   
8160: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
8170: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
8180: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
8190: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
81a0: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
81b0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
81c0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20  GetTickCount64, 
81d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
81e0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  lse.  { "GetTick
81f0: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
8200: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8230: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
8240: 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f  ickCount64 ((ULO
8250: 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  NGLONG(WINAPI*)(
8260: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
8270: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
8280: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8290: 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  T.  { "GetNative
82a0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
82b0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74   (SYSCALL)GetNat
82c0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  iveSystemInfo,  
82d0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
82e0: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
82f0: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
8300: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8320: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8330: 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53  ine osGetNativeS
8340: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
8350: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
8360: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e       LPSYSTEM_IN
8370: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d  FO))aSyscall[71]
8380: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8390: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
83a0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
83b0: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
83c0: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
83d0: 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62  YSCALL)OutputDeb
83e0: 75 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20  ugStringA,      
83f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8400: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8410: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8420: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8430: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8440: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8450: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
8460: 72 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e  ringA ((VOID(WIN
8470: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
8480: 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72  yscall[72].pCurr
8490: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
84a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
84b0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75  AS_WIDE).  { "Ou
84c0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
84d0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
84e0: 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  )OutputDebugStri
84f0: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
8500: 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74  else.  { "Output
8510: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8520: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8550: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74  f..#define osOut
8560: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20  putDebugStringW 
8570: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
8580: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
8590: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
85a0: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73  .  { "GetProcess
85b0: 48 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20  Heap",          
85c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
85d0: 65 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20  essHeap,        
85e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
85f0: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
8600: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
8610: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8620: 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[74].pCurrent).
8630: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8640: 49 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65  INRT && (!define
8650: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
8660: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
8670: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20  _MMAP_SIZE>0).  
8680: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
8690: 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53  pingFromApp", (S
86a0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
86b0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c  eMappingFromApp,
86c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
86d0: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
86e0: 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53  ngFromApp", (SYS
86f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8720: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
8730: 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48  ppingFromApp ((H
8740: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
8750: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
8760: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
8770: 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f  IBUTES,ULONG,ULO
8780: 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53  NG64,LPCWSTR))aS
8790: 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72  yscall[75].pCurr
87a0: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45  ent)../*.** NOTE
87b0: 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c  : On some sub-pl
87c0: 61 74 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74  atforms, the Int
87d0: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
87e0: 78 63 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f  xchange "functio
87f0: 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72  n".**       is r
8800: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63  eally just a mac
8810: 72 6f 20 74 68 61 74 20 75 73 65 73 20 61 20 63  ro that uses a c
8820: 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69  ompiler intrinsi
8830: 63 20 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a  c (e.g. x64)..**
8840: 20 20 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74         So do not
8850: 20 74 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69   try to make thi
8860: 73 20 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65  s is into a rede
8870: 66 69 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63  finable interfac
8880: 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
8890: 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  d(InterlockedCom
88a0: 70 61 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20  pareExchange).  
88b0: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  { "InterlockedCo
88c0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20  mpareExchange", 
88d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
88f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49   },..#define osI
8900: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8910: 65 45 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c  eExchange Interl
8920: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8930: 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22  ange.#else.  { "
8940: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8950: 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59  reExchange", (SY
8960: 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65  SCALL)Interlocke
8970: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8980: 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20  , 0 },..#define 
8990: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
89a0: 70 61 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c  pareExchange ((L
89b0: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e  ONG(WINAPI*)(LON
89c0: 47 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  G \.        SQLI
89d0: 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c  TE_WIN32_VOLATIL
89e0: 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61  E*, LONG,LONG))a
89f0: 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72  Syscall[76].pCur
8a00: 72 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20  rent).#endif /* 
8a10: 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63  defined(Interloc
8a20: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8a30: 67 65 29 20 2a 2f 0a 0a 7d 3b 20 2f 2a 20 45 6e  ge) */..}; /* En
8a40: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
8a50: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
8a60: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
8a70: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
8a80: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
8a90: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
8aa0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
8ab0: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
8ac0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
8ad0: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
8ae0: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
8af0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
8b00: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
8b10: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
8b20: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
8b30: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
8b40: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
8b50: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
8b60: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
8b70: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8b80: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
8b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8ba0: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
8bb0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
8bc0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
8bd0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8be0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
8bf0: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
8c00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8c10: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
8c20: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
8c30: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
8c40: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
8c50: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
8c60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
8c70: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
8c80: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
8c90: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
8ca0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
8cb0: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
8cc0: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
8cd0: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
8ce0: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
8cf0: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
8d00: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
8d10: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
8d20: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
8d30: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
8d40: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
8d50: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
8d60: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
8d70: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
8d90: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
8da0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
8db0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
8dc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
8dd0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
8de0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
8df0: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
8e00: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
8e10: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
8e20: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
8e30: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
8e40: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
8e50: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
8e60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
8e70: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
8e80: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
8e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
8ea0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
8eb0: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
8ec0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
8ed0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
8ee0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8ef0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
8f00: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
8f10: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
8f20: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
8f30: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
8f40: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
8f50: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
8f60: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
8f70: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
8f80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
8fa0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8fb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
8fc0: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
8fd0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
8fe0: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
8ff0: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
9000: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
9010: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
9020: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
9030: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
9040: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
9050: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
9060: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
9070: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
9080: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
9090: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
90a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
90b0: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
90c0: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
90d0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
90e0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
90f0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
9100: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
9110: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
9120: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
9130: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
9140: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
9150: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
9160: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
9170: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9180: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9190: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
91a0: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
91b0: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
91c0: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
91d0: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
91e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
91f0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
9200: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
9210: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
9220: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
9230: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
9240: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
9250: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
9260: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
9270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
9280: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
9290: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
92a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
92b0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
92c0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
92d0: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
92e0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
92f0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
9300: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
9310: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
9320: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
9330: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
9340: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
9350: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
9360: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
9370: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
9380: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
9390: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
93a0: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
93b0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
93c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
93d0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
93e0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20  MALLOC./*.** If 
93f0: 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  a Win32 native h
9400: 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  eap has been con
9410: 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75  figured, this fu
9420: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65  nction will atte
9430: 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63  mpt to.** compac
9440: 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63  t it.  Upon succ
9450: 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77  ess, SQLITE_OK w
9460: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
9470: 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20    Upon failure, 
9480: 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45  one.** of SQLITE
9490: 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45  _NOMEM, SQLITE_E
94a0: 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RROR, or SQLITE_
94b0: 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65  NOTFOUND will be
94c0: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a   returned.  The.
94d0: 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61  ** "pnLargest" a
94e0: 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d  rgument, if non-
94f0: 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73  zero, will be us
9500: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  ed to return the
9510: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
9520: 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65  largest committe
9530: 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20  d free block in 
9540: 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74  the heap, in byt
9550: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
9560: 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74  e3_win32_compact
9570: 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c  _heap(LPUINT pnL
9580: 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  argest){.  int r
9590: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
95a0: 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d   UINT nLargest =
95b0: 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65   0;.  HANDLE hHe
95c0: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
95d0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
95e0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
95f0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
9600: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
9610: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
9620: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
9630: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
9640: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9650: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9660: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9670: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
9680: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
9690: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
96a0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
96b0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L) );.#endif.#if
96c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
96d0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
96e0: 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61  WINRT.  if( (nLa
96f0: 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70  rgest=osHeapComp
9700: 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54  act(hHeap, SQLIT
9710: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9720: 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  GS))==0 ){.    D
9730: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
9740: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9750: 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45  );.    if( lastE
9760: 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29  rrno==NO_ERROR )
9770: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9780: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9790: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
97a0: 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61  pCompact (no spa
97b0: 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  ce), heap=%p",. 
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
97e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
97f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
9800: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9810: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52  3_log(SQLITE_ERR
9820: 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  OR, "failed to H
9830: 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29  eapCompact (%lu)
9840: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
9860: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9870: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9880: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9890: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
98a0: 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  }.#else.  sqlite
98b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
98c0: 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74  FOUND, "failed t
98d0: 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68  o HeapCompact, h
98e0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
98f0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9900: 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  eap);.  rc = SQL
9910: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65  ITE_NOTFOUND;.#e
9920: 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72  ndif.  if( pnLar
9930: 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73  gest ) *pnLarges
9940: 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20  t = nLargest;.  
9950: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9960: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
9970: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
9980: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
9990: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
99a0: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
99b0: 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63   destroy and rec
99c0: 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68  reate it.  If th
99d0: 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  e Win32 native h
99e0: 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61  eap is not isola
99f0: 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68  ted and/or.** th
9a00: 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  e sqlite3_memory
9a10: 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e  _used() function
9a20: 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e   does not return
9a30: 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55   zero, SQLITE_BU
9a40: 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  SY will.** be re
9a50: 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68  turned and no ch
9a60: 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
9a70: 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  de to the Win32 
9a80: 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a  native heap..*/.
9a90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
9aa0: 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a  2_reset_heap(){.
9ab0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45    int rc;.  MUTE
9ac0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
9ad0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
9ae0: 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73   ) /* The main s
9af0: 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20  tatic mutex */. 
9b00: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
9b10: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65  lite3_mutex *pMe
9b20: 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d  m; )    /* The m
9b30: 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74  emsys static mut
9b40: 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  ex */.  MUTEX_LO
9b50: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
9b60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
9b70: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9b80: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
9b90: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
9ba0: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
9bb0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
9bc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9bd0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
9be0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9bf0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
9c00: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9c10: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
9c20: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
9c30: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
9c40: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
9c50: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
9c60: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
9c70: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
9c80: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
9c90: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
9ca0: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
9cb0: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
9cc0: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
9cd0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
9ce0: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
9cf0: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
9d00: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
9d10: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
9d20: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
9d30: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
9d40: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
9d50: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
9d60: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
9d70: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
9d80: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
9d90: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
9da0: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
9db0: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
9dc0: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
9dd0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
9de0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
9df0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
9e00: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9e10: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
9e20: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
9e30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
9e40: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
9e50: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
9e60: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
9e70: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
9e80: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
9e90: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
9ea0: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
9eb0: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
9ec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ed0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
9ee0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
9ef0: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
9f00: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
9f10: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9f20: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
9f30: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
9f40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
9f60: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
9f70: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9f80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9f90: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
9fa0: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
9fb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
9fc0: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
9fd0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
9fe0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
9ff0: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
a000: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
a010: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a020: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
a030: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
a040: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
a050: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a060: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a070: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a090: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
a0a0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
a0b0: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
a0c0: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
a0d0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
a0e0: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
a0f0: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
a100: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
a110: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
a120: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
a130: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
a140: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
a150: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a160: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
a170: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
a180: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a190: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
a1a0: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
a1b0: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
a1c0: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
a1d0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
a1e0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
a1f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
a200: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
a210: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
a220: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a230: 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ZE );.#if define
a240: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a250: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
a260: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
a270: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
a280: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a290: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
a2a0: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
a2b0: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
a2c0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
a2d0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
a2e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
a2f0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
a300: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
a310: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a320: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
a330: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
a340: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a350: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a360: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
a370: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a380: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
a390: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
a3a0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
a3b0: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
a3c0: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
a3d0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
a3e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a3f0: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
a400: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
a410: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
a420: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a430: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
a440: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
a450: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
a460: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
a470: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
a480: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
a490: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
a4a0: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
a4b0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
a4c0: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
a4d0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
a4e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
a4f0: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
a500: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
a510: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a520: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
a530: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
a540: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
a550: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
a560: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
a570: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
a580: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
a590: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
a5a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a5b0: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
a5c0: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
a5d0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
a5e0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
a5f0: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
a600: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
a610: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
a620: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
a630: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
a640: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
a650: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
a660: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
a670: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
a6a0: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
a6b0: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
a6c0: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
a6d0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
a6e0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
a6f0: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
a700: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
a710: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
a720: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
a730: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
a740: 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21 53  _THREADS>0 && !S
a750: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
a760: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
a770: 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  RT && \.        
a780: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a790: 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74 65  E>0.DWORD sqlite
a7a0: 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c  3Win32Wait(HANDL
a7b0: 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57  E hObject){.  DW
a7c0: 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28  ORD rc;.  while(
a7d0: 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72   (rc = osWaitFor
a7e0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68  SingleObjectEx(h
a7f0: 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45  Object, INFINITE
a800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d           TRUE))=
a830: 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54  =WAIT_IO_COMPLET
a840: 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e  ION ){}.  return
a850: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
a860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
a870: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
a880: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
a890: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
a8a0: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
a8b0: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
a8c0: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
a8d0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
a8e0: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
a8f0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
a900: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
a910: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
a920: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
a930: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
a940: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
a950: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
a960: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
a970: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
a980: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
a990: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
a9a0: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
a9b0: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
a9c0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
a9d0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
a9e0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
a9f0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
aa00: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
aa10: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
aa20: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
aa30: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
aa40: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
aa50: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
aa60: 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  .*/..#if !define
aa70: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
aa80: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20  ETVERSIONEX) || 
aa90: 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  !SQLITE_WIN32_GE
aaa0: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66  TVERSIONEX.# def
aab0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
aac0: 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f  ).#elif SQLITE_O
aad0: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
aae0: 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64  E_OS_WINRT || !d
aaf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
ab00: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20  N32_HAS_ANSI).# 
ab10: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
ab20: 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69   (1).#elif !defi
ab30: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
ab40: 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66  _HAS_WIDE).# def
ab50: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30  ine osIsNT()  (0
ab60: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
ab70: 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c   osIsNT()  ((sql
ab80: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29  ite3_os_type==2)
ab90: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   || sqlite3_win3
aba0: 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69  2_is_nt()).#endi
abb0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
abc0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
abd0: 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65  s if the machine
abe0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65   is running a ve
abf0: 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73  rsion of Windows
ac00: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
ac10: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69   NT kernel..*/.i
ac20: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
ac30: 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69  _is_nt(void){.#i
ac40: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
ac50: 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  T.  /*.  ** NOTE
ac60: 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d  : The WinRT sub-
ac70: 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61  platform is alwa
ac80: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
ac90: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
aca0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e  .  **       kern
acb0: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  el..  */.  retur
acc0: 6e 20 31 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  n 1;.#elif defin
acd0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
ace0: 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26  GETVERSIONEX) &&
acf0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
ad00: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28  TVERSIONEX.  if(
ad10: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
ad20: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
ad30: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
ad40: 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20  0, 0)==0 ){.#if 
ad50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
ad60: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
ad70: 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f     OSVERSIONINFO
ad80: 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e  A sInfo;.    sIn
ad90: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
ada0: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
adb0: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65  sInfo);.    osGe
adc0: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
add0: 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72  fo);.    osInter
ade0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
adf0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
ae00: 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  s_type,.        
ae10: 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72  (sInfo.dwPlatfor
ae20: 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46  mId == VER_PLATF
ae30: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20  ORM_WIN32_NT) ? 
ae40: 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66  2 : 1, 0);.#elif
ae50: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
ae60: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
ae70: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
ae80: 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49  OW sInfo;.    sI
ae90: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
aea0: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
aeb0: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47  (sInfo);.    osG
aec0: 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49  etVersionExW(&sI
aed0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65  nfo);.    osInte
aee0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
aef0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
af00: 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20  os_type,.       
af10: 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f   (sInfo.dwPlatfo
af20: 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54  rmId == VER_PLAT
af30: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f  FORM_WIN32_NT) ?
af40: 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64   2 : 1, 0);.#end
af50: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
af60: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
af70: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
af80: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32  lite3_os_type, 2
af90: 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53  , 2)==2;.#elif S
afa0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74  QLITE_TEST.  ret
afb0: 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  urn osInterlocke
afc0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
afd0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
afe0: 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c  e, 2, 2)==2;.#el
aff0: 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  se.  /*.  ** NOT
b000: 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66  E: All sub-platf
b010: 6f 72 6d 73 20 77 68 65 72 65 20 74 68 65 20 47  orms where the G
b020: 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20  etVersionEx[AW] 
b030: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20  functions are.  
b040: 2a 2a 20 20 20 20 20 20 20 64 65 70 72 65 63 61  **       depreca
b050: 74 65 64 20 61 72 65 20 61 6c 77 61 79 73 20 61  ted are always a
b060: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
b070: 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72  ed on the NT ker
b080: 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  nel..  */.  retu
b090: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
b0a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
b0b0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
b0c0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
b0d0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
b0e0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
b0f0: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
b100: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
b110: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
b120: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
b130: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
b140: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
b150: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
b160: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
b170: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
b180: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b190: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b1a0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b1b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b1c0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b1d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
b1e0: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
b1f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b200: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
b210: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
b220: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
b230: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
b240: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
b250: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b260: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
b270: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
b280: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b290: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b2a0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
b2b0: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  oc %u bytes (%lu
b2c0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
b2e0: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
b2f0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
b300: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
b310: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
b320: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
b330: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
b340: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
b350: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
b360: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
b370: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b380: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b390: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b3a0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b3b0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b3c0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b3d0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b3e0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b3f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b400: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b410: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b420: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b430: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b440: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b450: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
b460: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
b470: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
b480: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
b490: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
b4a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
b4b0: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
b4c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b4d0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
b4e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b4f0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b500: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
b510: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ree block %p (%l
b520: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
b540: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
b550: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
b560: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
b570: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
b580: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
b590: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
b5a0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
b5b0: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
b5c0: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
b5d0: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
b5e0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
b5f0: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
b600: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
b610: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
b620: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
b630: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
b640: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
b650: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
b660: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
b670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
b680: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
b690: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
b6a0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
b6b0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
b6c0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
b6d0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
b6e0: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
b6f0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
b700: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
b710: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
b720: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
b730: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b740: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b750: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
b760: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
b770: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
b780: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b790: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b7a0: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
b7b0: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
b7c0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
b7d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b7e0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
b7f0: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
b800: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b820: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
b830: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
b840: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
b850: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b870: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b880: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b890: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
b8a0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
b8b0: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
b8c0: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
b8d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
b8e0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
b8f0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
b900: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
b910: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
b920: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
b930: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
b940: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
b950: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b960: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
b970: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
b980: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b990: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
b9a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
b9b0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
b9c0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
b9d0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
b9e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b9f0: 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e  FLAGS, p) );.#en
ba00: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
ba10: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
ba20: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
ba30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
ba40: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
ba50: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
ba60: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
ba70: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
ba80: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
ba90: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
baa0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
bab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bac0: 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72   p, osGetLastErr
bad0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
bae0: 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ap);.    return 
baf0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
bb00: 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (int)n;.}../*.**
bb10: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
bb20: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
bb30: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
bb40: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ation size..*/.s
bb50: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
bb60: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
bb70: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
bb80: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
bb90: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
bba0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
bbb0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
bbc0: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
bbd0: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
bbe0: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
bbf0: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
bc00: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
bc10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
bc20: 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20  RROR;.  assert( 
bc30: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
bc40: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
bc50: 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  C1 );.  assert( 
bc60: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
bc70: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic2==WINMEM_MAGI
bc80: 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  C2 );..#if !SQLI
bc90: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
bca0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bcb0: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
bcc0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
bcd0: 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64  p ){.    DWORD d
bce0: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53  wInitialSize = S
bcf0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bd00: 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20  _INIT_SIZE;.    
bd10: 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53  DWORD dwMaximumS
bd20: 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c  ize = (DWORD)sql
bd30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
bd40: 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20  .nHeap;.    if( 
bd50: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30  dwMaximumSize==0
bd60: 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69   ){.      dwMaxi
bd70: 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  mumSize = SQLITE
bd80: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
bd90: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  SIZE;.    }else 
bda0: 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  if( dwInitialSiz
bdb0: 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20  e>dwMaximumSize 
bdc0: 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69  ){.      dwIniti
bdd0: 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d  alSize = dwMaxim
bde0: 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  umSize;.    }.  
bdf0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
be00: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
be10: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
be20: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
be60: 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29  , dwMaximumSize)
be70: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
be80: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
be90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
bea0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
beb0: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
bec0: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
bed0: 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75   (%lu), flags=%u
bee0: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20  , initSize=%lu, 
bef0: 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20  maxSize=%lu",.  
bf00: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
bf10: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
bf20: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
bf30: 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  S, dwInitialSize
bf40: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77 4d 61  ,.          dwMa
bf50: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
bf60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
bf80: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
bf90: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
bfa0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
bfb0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
bfc0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
bfd0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
bfe0: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
bff0: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
c000: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
c010: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c020: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
c030: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
c040: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
c050: 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c  p (%lu)", osGetL
c060: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
c070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c080: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
c090: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c0a0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
c0b0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
c0c0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
c0d0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
c0e0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c0f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c100: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c110: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
c120: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
c130: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c140: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c150: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
c160: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c170: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c180: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
c190: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c1a0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
c1b0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
c1c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c1d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
c1e0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
c1f0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
c200: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
c210: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
c220: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c230: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c240: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c250: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c260: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c270: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
c280: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c290: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
c2a0: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
c2b0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c2c0: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
c2d0: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
c2e0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c2f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c300: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c310: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
c320: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
c330: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
c340: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
c350: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
c360: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
c370: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c380: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
c390: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
c3a0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c3b0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
c3c0: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
c3d0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
c3e0: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
c3f0: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
c400: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
c410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c420: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
c430: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
c440: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
c450: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
c470: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c480: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
c490: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
c4a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
c4b0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
c4c0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
c4d0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c4e0: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
c4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
c500: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
c510: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c520: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
c530: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
c540: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
c550: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
c560: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
c570: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
c580: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
c590: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
c5a0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
c5b0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
c5c0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
c5d0: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
c5e0: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
c5f0: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
c600: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
c610: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
c620: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
c630: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
c640: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
c650: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
c660: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c670: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
c680: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
c690: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
c6a0: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
c6b0: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
c6c0: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
c6d0: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
c6e0: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
c6f0: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
c700: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
c710: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
c720: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
c730: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
c740: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
c750: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
c760: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
c770: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
c780: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
c790: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
c7a0: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
c7b0: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
c7c0: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
c7d0: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
c7e0: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
c7f0: 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46  oft Unicode (UTF
c800: 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  -16?)..**.** Spa
c810: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
c820: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c830: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
c840: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
c850: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
c860: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
c870: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
c880: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
c890: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
c8a0: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
c8b0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
c8c0: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
c8d0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
c8e0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
c8f0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
c900: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c910: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
c920: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
c930: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
c940: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
c950: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
c960: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
c970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c980: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
c990: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
c9a0: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
c9b0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
c9c0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
c9f0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
ca00: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
ca10: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
ca20: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
ca30: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
ca40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
ca50: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
ca60: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
ca70: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
ca80: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
ca90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
caa0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
cab0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
cac0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
cae0: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
caf0: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
cb00: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
cb10: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
cb20: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42  zFilename;..  nB
cb30: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
cb40: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
cb50: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
cb60: 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c  ename, -1, 0, 0,
cb70: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
cb80: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
cb90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cba0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
cbb0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
cbc0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
cbd0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
cbe0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cbf0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
cc00: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
cc10: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
cc20: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
cc30: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
cc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
cc70: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
cc80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
cc90: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
cca0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
ccb0: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
ccc0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
ccd0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
cce0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
ccf0: 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   Unicode, based 
cd00: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
cd10: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
cd20: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
cd30: 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
cd40: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
cd50: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
cd60: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
cd70: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a  qlite3_malloc..*
cd80: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
cd90: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
cda0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
cdb0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
cdc0: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
cdd0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  MbcsFilename;.  
cde0: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
cdf0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
ce00: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
ce10: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
ce20: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
ce30: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
ce40: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
ce50: 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20   -1, NULL,.     
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69             0)*si
ce80: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69  zeof(WCHAR);.  i
ce90: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
cea0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ceb0: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
cec0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
ced0: 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
cee0: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
cef0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
cf00: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
cf10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cf20: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
cf30: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
cf40: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
cf50: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
cf60: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20  zMbcsFilename,. 
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
cf90: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
cfa0: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  te==0 ){.    sql
cfb0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46  ite3_free(zMbcsF
cfc0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
cfd0: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
cfe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
cff0: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
d000: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
d010: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
d020: 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68  to multi-byte ch
d030: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20  aracter string, 
d040: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d050: 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65  user's ANSI code
d060: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
d070: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d080: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d090: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
d0a0: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
d0b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
d0c0: 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f  ar *winUnicodeTo
d0d0: 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69  Mbcs(LPCWSTR zWi
d0e0: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
d0f0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
d100: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
d110: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
d120: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
d130: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
d140: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
d150: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d160: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
d170: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
d180: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
d190: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
d1a0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
d1b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
d1c0: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
d1d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
d1e0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
d1f0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
d200: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d210: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
d220: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
d230: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
d240: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
d250: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
d280: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
d290: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
d2a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
d2b0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
d2c0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
d2d0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
d2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d2f0: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
d300: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
d310: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
d320: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
d330: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d340: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d350: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d360: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
d370: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
d380: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
d390: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
d3a0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74  har *zFilenameUt
d3b0: 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  f8;.  LPWSTR zTm
d3c0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
d3d0: 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e  de = winMbcsToUn
d3e0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
d3f0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
d400: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d410: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
d420: 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  nameUtf8 = winUn
d430: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
d440: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
d450: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
d460: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d470: 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameUtf8;.}../*.*
d480: 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20  * Convert UTF-8 
d490: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
d4a0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20  racter string.  
d4b0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d4c0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
d4d0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d4e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d4f0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
d500: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
d510: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73  tf8_to_mbcs(cons
d520: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
d530: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
d540: 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57  enameMbcs;.  LPW
d550: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
d560: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55   zTmpWide = winU
d570: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
d580: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
d590: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
d5a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d5b0: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
d5c0: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62  = winUnicodeToMb
d5d0: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
d5e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
d5f0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
d600: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
d610: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d620: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
d630: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
d640: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
d650: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
d660: 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64  on.** the provid
d670: 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  ed arguments.  T
d680: 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74  he type argument
d690: 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72   must be 1 in or
d6a0: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a  der to set the.*
d6b0: 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  * data directory
d6c0: 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74   or 2 in order t
d6d0: 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72  o set the tempor
d6e0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
d6f0: 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72  The zValue.** ar
d700: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
d710: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
d720: 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65  ory to use.  The
d730: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69   return value wi
d740: 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  ll be.** SQLITE_
d750: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
d760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d770: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
d780: 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c  tory(DWORD type,
d790: 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29   LPCWSTR zValue)
d7a0: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72  {.  char **ppDir
d7b0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e  ectory = 0;.#ifn
d7c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d7d0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72  AUTOINIT.  int r
d7e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
d7f0: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
d800: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d810: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70  #endif.  if( typ
d820: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d830: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
d840: 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72  YPE ){.    ppDir
d850: 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65  ectory = &sqlite
d860: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
d870: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79  ;.  }else if( ty
d880: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
d890: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
d8a0: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
d8b0: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
d8c0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
d8d0: 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
d8e0: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
d8f0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d900: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
d910: 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20  RY_TYPE.        
d920: 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54    || type==SQLIT
d930: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
d940: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b  ECTORY_TYPE.  );
d950: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
d960: 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74  rectory || sqlit
d970: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
d980: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20  e(*ppDirectory, 
d990: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
d9a0: 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74 6f  .  if( ppDirecto
d9b0: 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ry ){.    char *
d9c0: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a  zValueUtf8 = 0;.
d9d0: 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26      if( zValue &
d9e0: 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20  & zValue[0] ){. 
d9f0: 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20       zValueUtf8 
da00: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
da10: 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  f8(zValue);.    
da20: 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66    if ( zValueUtf
da30: 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  8==0 ){.        
da40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
da50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
da60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
da70: 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ree(*ppDirectory
da80: 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74  );.    *ppDirect
da90: 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38  ory = zValueUtf8
daa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
dab0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
dac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dad0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  R;.}../*.** The 
dae0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
daf0: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
db00: 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  sg.** is zero if
db10: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
db20: 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
db30: 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
db40: 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
db50: 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
db60: 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  was truncated)..
db70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
db80: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
db90: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
dba0: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
dbb0: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
dbc0: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
dbd0: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
dbe0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
dbf0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
dc00: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
dc10: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
dc20: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
dc30: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
dc40: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
dc50: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
dc60: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
dc70: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
dc80: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e   0;..  if( osIsN
dc90: 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
dca0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57  E_OS_WINRT.    W
dcb0: 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53  CHAR zTempWide[S
dcc0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
dcd0: 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b  ERRMSG_CHARS+1];
dce0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
dcf0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
dd00: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
dd10: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
dd40: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
dd50: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
dda0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ddc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
dde0: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
de10: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
de20: 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20  HARS,.          
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20     0);.#else.   
de50: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
de60: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
de70: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
de80: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
de90: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
dea0: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
ded0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
dee0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
df00: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
df10: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
df40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
df60: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
dfb0: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64          0);.#end
e000: 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  if.    if( dwLen
e010: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
e020: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
e030: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
e040: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
e050: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
e060: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e070: 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63    zOut = winUnic
e080: 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57  odeToUtf8(zTempW
e090: 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ide);.      sqli
e0a0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
e0b0: 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  oc();.#if !SQLIT
e0c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
e0d0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e0e0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e0f0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e100: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e110: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e120: 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Wide);.#endif.  
e130: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
e140: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
e150: 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
e160: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
e170: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
e180: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
e190: 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  A(FORMAT_MESSAGE
e1a0: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
e1b0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
e1e0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
e210: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
e220: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
e270: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c   (LPSTR) &zTemp,
e2c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
e300: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
e310: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
e320: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
e330: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
e340: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
e350: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
e360: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e370: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
e380: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
e390: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  f8(zTemp);.     
e3a0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
e3b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e3c0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e3d0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e3e0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e3f0: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e400: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
e420: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
e430: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
e440: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e450: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
e460: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
e470: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
e480: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
e490: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
e4a0: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
e4b0: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
e4c0: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
e4d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e4e0: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
e4f0: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
e500: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
e510: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
e520: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
e530: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e540: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
e550: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
e560: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
e570: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
e580: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
e590: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
e5a0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
e5b0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
e5c0: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
e5d0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
e5e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
e5f0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
e600: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
e610: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
e620: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e630: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
e640: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
e650: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
e660: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
e670: 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d   from.** FormatM
e680: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
e690: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
e6a0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
e6b0: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
e6c0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
e6d0: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
e6e0: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
e6f0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
e700: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
e710: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a  TE_CANTOPEN)..**
e720: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
e730: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
e740: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
e750: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
e760: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
e770: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
e780: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
e790: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
e7a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
e7b0: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
e7c0: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
e7d0: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
e7e0: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
e7f0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
e800: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
e810: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e820: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
e830: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
e840: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
e870: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
e880: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
e890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
e8a0: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
e8b0: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
e8c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
e8d0: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
e8e0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
e8f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
e900: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
e910: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
e920: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
e930: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
e940: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
e950: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
e960: 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
e970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e980: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
e990: 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
e9a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e9d0: 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
e9e0: 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
e9f0: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
ea00: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
ea10: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
ea20: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
ea30: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
ea40: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
ea50: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
ea60: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
ea70: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
ea80: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
ea90: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
eaa0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
eab0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
eac0: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
ead0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
eae0: 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
eaf0: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
eb00: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
eb10: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
eb20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
eb30: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
eb40: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
eb50: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
eb60: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
eb70: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
eb80: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
eb90: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
eba0: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
ebb0: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
ebc0: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
ebd0: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
ebe0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
ebf0: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
ec00: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
ec10: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
ec20: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
ec30: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
ec40: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
ec50: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
ec60: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
ec70: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
ec80: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
ec90: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
eca0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
ecb0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
ecc0: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
ecd0: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
ece0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
ecf0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
ed00: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
ed10: 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
ed20: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
ed30: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
ed40: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  DELAY;../*.** Th
ed50: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
ed60: 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75  try1" macro is u
ed70: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
ed80: 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
ed90: 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   I/O.** error co
eda0: 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  de obtained via 
edb0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69  GetLastError() i
edc0: 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  s eligible to be
edd0: 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a   retried.  It.**
ede0: 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65   must accept the
edf0: 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52   error code DWOR
ee00: 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72  D as its only ar
ee10: 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c  gument and shoul
ee20: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
ee30: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
ee40: 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69  r code is transi
ee50: 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e  ent in nature an
ee60: 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  d the operation.
ee70: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
ee80: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
ee90: 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72  e original error
eea0: 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75   might succeed u
eeb0: 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74  pon being.** ret
eec0: 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d  ried.  The argum
eed0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
eee0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61  o should be a va
eef0: 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64  riable..**.** Ad
ef00: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61  ditionally, a ma
ef10: 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f  cro named "winIo
ef20: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ef30: 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49  y be defined.  I
ef40: 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  f it.** is defin
ef50: 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ed, it will be c
ef60: 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68  onsulted only wh
ef70: 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69  en the macro "wi
ef80: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
ef90: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  .** returns zero
efa0: 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  .  The "winIoerr
efb0: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
efc0: 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f   is completely o
efd0: 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d  ptional and.** m
efe0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e  ay be used to in
eff0: 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c  clude additional
f000: 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20   error codes in 
f010: 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f  the set that sho
f020: 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  uld.** result in
f030: 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f   the failing I/O
f040: 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67   operation being
f050: 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20   retried by the 
f060: 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64  caller.  If.** d
f070: 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e  efined, the "win
f080: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
f090: 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62  macro must exhib
f0a0: 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
f0b0: 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63  ntics.** identic
f0c0: 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74  al to those of t
f0d0: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
f0e0: 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f  etry1" macro..*/
f0f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69  .#if !defined(wi
f100: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29  nIoerrCanRetry1)
f110: 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72  .#define winIoer
f120: 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28  rCanRetry1(a) ((
f130: 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53  (a)==ERROR_ACCES
f140: 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20  S_DENIED)       
f150: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f180: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
f190: 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20  N)    || \.     
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f1c0: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
f1d0: 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ION)       || \.
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f200: 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f  a)==ERROR_DEV_NO
f210: 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20  T_EXIST)        
f220: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
f250: 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20  ETNAME_DELETED) 
f260: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f280: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
f290: 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
f2a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
f2d0: 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b  )==ERROR_NETWORK
f2e0: 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23  _UNREACHABLE)).#
f2f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
f300: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
f310: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
f320: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
f330: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
f340: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
f350: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
f360: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
f370: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
f380: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
f390: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
f3a0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f3b0: 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
f3c0: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
f3d0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
f3e0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
f3f0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
f400: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
f410: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
f420: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
f430: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
f440: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f450: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
f460: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f470: 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
f480: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
f490: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
f4a0: 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
f4b0: 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
f4c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f4d0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77   }.#if defined(w
f4e0: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
f4f0: 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e  ).  else if( win
f500: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65  IoerrCanRetry2(e
f510: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f520: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f530: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f540: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f550: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f560: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f570: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
f580: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
f590: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
f5a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f5b0: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
f5c0: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
f5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f5e0: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
f5f0: 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e  nRetry){.  if( n
f600: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  Retry ){.    sql
f610: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
f620: 49 4f 45 52 52 2c 0a 20 20 20 20 20 20 22 64 65  IOERR,.      "de
f630: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
f640: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
f650: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
f660: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f670: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
f680: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
f690: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
f6a0: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
f6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f6f0: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
f700: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
f710: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
f720: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
f730: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
f740: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
f750: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
f760: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
f770: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
f780: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
f790: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
f7a0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
f7b0: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
f7c0: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
f7d0: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
f7e0: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
f7f0: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
f800: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
f810: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
f820: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
f830: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
f840: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
f850: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
f860: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
f870: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
f880: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
f890: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
f8a0: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
f8b0: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
f8c0: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
f8d0: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
f8e0: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
f8f0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
f900: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
f910: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
f920: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
f930: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
f940: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
f950: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
f960: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
f970: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
f980: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
f990: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
f9a0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
f9b0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
f9c0: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
f9d0: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
f9e0: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
f9f0: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
fa00: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
fa10: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
fa20: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
fa30: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
fa40: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
fa50: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
fa60: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
fa70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
fa80: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
fa90: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
faa0: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
fab0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
fac0: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
fad0: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
fae0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
faf0: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
fb00: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
fb10: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
fb20: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
fb30: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
fb40: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
fb50: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
fb60: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
fb70: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
fb80: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
fb90: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
fba0: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
fbb0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
fbc0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
fbd0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
fbe0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
fbf0: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
fc00: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
fc10: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
fc20: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
fc30: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
fc40: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
fc50: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
fc60: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
fc70: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
fc80: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
fc90: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
fca0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
fcb0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
fcc0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
fcd0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
fce0: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
fcf0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
fd00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
fd10: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
fd20: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
fd30: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
fd40: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
fd50: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
fd60: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
fd70: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
fd80: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
fd90: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
fda0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
fdb0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
fdc0: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
fdd0: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
fde0: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
fdf0: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
fe00: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
fe10: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
fe20: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
fe30: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
fe40: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
fe50: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
fe60: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
fe70: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
fe80: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
fe90: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
fea0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
feb0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
fec0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
fed0: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
fee0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
fef0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
ff00: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
ff10: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
ff40: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
ff50: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
ff60: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
ff70: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
ff80: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
ff90: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
ffa0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
ffb0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
ffc0: 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
ffd0: 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
ffe0: 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
fff0: 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
10000 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
10010 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
10020 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
10030 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
10040 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
10050 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
10060 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
10070 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
10080 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
10090 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
100a0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
100b0 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
100c0 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
10100 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
10110 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
10150 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
10160 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
10170 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
10180 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
10190 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
101a0 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
101b0 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
101c0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
101d0 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
101e0 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
101f0 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
10200 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
10210 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
10220 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
10230 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
10240 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
10250 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10260 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
10270 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
10280 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
10290 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
102a0 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
102b0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
102c0 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
102d0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
102e0 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
102f0 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
10300 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
10310 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
10320 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
10330 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
10340 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
10350 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
10360 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
10370 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
10380 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
10390 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
103a0 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
103b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
103c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
103d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
103e0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
103f0 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
10400 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
10410 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10420 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
10430 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
10440 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
10450 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
10460 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
10470 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
10480 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
10490 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
104a0 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
104b0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
104c0 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
104d0 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
104e0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
104f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
10500 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
10510 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10520 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
10530 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10550 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
10560 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
10570 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
10580 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
10590 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
105a0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
105b0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
105c0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
105d0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
105e0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
105f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10600 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
10610 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
10620 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
10630 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
10640 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
10650 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
10660 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
10670 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
10680 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
10690 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
106a0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
106b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
106c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
106d0 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
106e0 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
106f0 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
10700 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
10710 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
10720 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
10730 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
10740 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
10750 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
10760 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
10770 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
10780 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
10790 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
107a0 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
107b0 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
107c0 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
107d0 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
107e0 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
107f0 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
10800 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
10810 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10820 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
10830 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10840 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
10850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10860 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
10870 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
10880 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
10890 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
108a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
108b0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
108c0 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
108d0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
108e0 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
108f0 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
10900 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
10910 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
10920 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10930 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
10940 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
10950 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
10960 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
10970 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10980 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
10990 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
109a0 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
109b0 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
109c0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
109d0 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
109e0 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
109f0 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
10a00 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
10a10 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
10a20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10a30 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
10a40 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
10a50 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
10a60 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
10a70 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
10a80 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
10a90 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
10aa0 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
10ab0 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
10ac0 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
10ad0 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
10ae0 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
10af0 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
10b00 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
10b10 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
10b20 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
10b30 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
10b40 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
10b50 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
10b60 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
10b70 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
10b80 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
10b90 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10ba0 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
10bb0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10bc0 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
10bd0 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
10be0 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
10bf0 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
10c00 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
10c10 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
10c20 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
10c30 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
10c40 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
10c50 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
10c60 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
10c70 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
10c80 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
10c90 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
10ca0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
10cb0 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
10cc0 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
10cd0 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
10ce0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10cf0 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
10d00 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10d10 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
10d20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
10d30 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
10d40 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
10d50 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
10d60 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
10d70 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
10d80 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
10d90 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
10da0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
10db0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
10dc0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
10dd0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
10de0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
10df0 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
10e00 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
10e10 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
10e20 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10e30 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
10e40 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
10e50 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
10e60 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10e70 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
10e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10e90 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
10ea0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
10eb0 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
10ec0 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
10ed0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
10ee0 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
10ef0 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
10f00 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
10f10 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
10f20 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
10f30 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
10f40 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
10f50 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
10f60 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
10f70 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
10f80 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
10f90 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10fa0 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
10fb0 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
10fc0 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
10fd0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
10fe0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10ff0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
11000 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
11010 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
11020 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
11030 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
11040 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
11050 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
11060 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
11070 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
11080 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
11090 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
110a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
110b0 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
110c0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
110d0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
110e0 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
110f0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
11110 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11120 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11130 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
11140 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
11150 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
11160 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
11170 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
11180 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
11190 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
111a0 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
111b0 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
111c0 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
111d0 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
111e0 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
111f0 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
11200 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
11210 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
11220 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
11230 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
11240 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
11250 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
11260 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
11270 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
11280 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
11290 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
112a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
112b0 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
112c0 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
112d0 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
112e0 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
112f0 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
11300 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
11310 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
11320 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
11330 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
11340 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
11350 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
11360 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11370 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
11380 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
11390 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
113a0 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
113b0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
113c0 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
113d0 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
113e0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
113f0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11400 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
11410 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
11420 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
11430 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11440 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11450 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
11460 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11470 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
11480 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
11490 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
114a0 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
114b0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
114c0 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
114d0 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
114e0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
114f0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
11500 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
11510 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
11520 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
11530 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11540 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
11550 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
11560 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11570 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
11580 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11590 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
115a0 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
115b0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
115c0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
115d0 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
115e0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
115f0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11600 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11610 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
11620 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11630 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11640 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11650 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11660 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
11670 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11680 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
11690 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
116a0 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
116b0 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
116c0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
116d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
116e0 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
116f0 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
11700 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
11710 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
11720 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
11730 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11740 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11750 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11760 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11770 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
11780 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11790 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
117a0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
117b0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
117c0 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
117d0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
117e0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
117f0 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
11800 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11810 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
11820 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
11830 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
11840 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
11850 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
118a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
118b0 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
118c0 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
118d0 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
118e0 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
118f0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11900 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
11910 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
11920 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
11930 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
11940 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
11950 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11960 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
11970 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11980 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
11990 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
119a0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
119b0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
119c0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
119d0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
119e0 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
119f0 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
11a00 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
11a10 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
11a20 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
11a30 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11a40 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
11a50 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
11a60 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
11a70 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
11a80 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
11a90 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
11aa0 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
11ab0 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
11ac0 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
11ad0 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
11ae0 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
11af0 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
11b00 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
11b10 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
11b20 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11b30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11b40 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11b50 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
11b60 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
11b70 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
11b80 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
11b90 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
11ba0 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
11bb0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
11bc0 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
11bd0 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
11be0 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
11bf0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11c00 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
11c10 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
11c20 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
11c30 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
11c40 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
11c50 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
11c60 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
11c70 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
11c80 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
11c90 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
11ca0 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
11cb0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
11cc0 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
11cd0 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
11ce0 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
11cf0 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
11d00 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
11d10 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
11d40 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
11d50 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
11d60 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
11d70 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
11d80 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
11d90 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
11da0 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
11db0 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
11dc0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
11dd0 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
11de0 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
11df0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
11e00 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
11e10 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
11e20 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
11e30 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
11e40 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
11e50 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
11e60 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
11e70 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
11ea0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
11eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11f00 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
11f10 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
11f20 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
11f30 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
11f40 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
11f50 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
11f60 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fb0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
11fc0 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
11fd0 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
11fe0 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
11ff0 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
12000 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
12010 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
12020 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
12030 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
12040 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
12050 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
12060 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
12070 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
12080 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
12090 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
120a0 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
120b0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
120c0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
120d0 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
120e0 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
120f0 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
12100 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
12110 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
12120 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
12130 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
12140 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
12150 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12160 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
12170 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
12180 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
12190 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
121a0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
121b0 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121d0 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
121e0 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
121f0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
12200 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12210 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
12220 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
12230 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
12240 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12260 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
12270 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
12280 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
12290 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
122a0 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
122b0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
122c0 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
122d0 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
122e0 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
122f0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
12300 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
12310 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
12320 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
12330 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
12340 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
12350 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
12360 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
12370 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
12380 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
12390 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
123a0 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
123b0 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
123c0 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
123d0 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
123e0 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
123f0 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
12400 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
12410 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
12420 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
12430 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
12440 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
12450 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
12460 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
12470 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
12480 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
12490 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
124a0 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
124b0 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
124c0 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
124d0 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
124e0 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
124f0 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
12500 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
12510 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
12520 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
12530 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12540 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
12550 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12560 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12570 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
12580 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12590 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
125a0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
125b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
125c0 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
125d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
125e0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
125f0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
12600 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
12610 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
12620 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
12630 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12640 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12650 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12660 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
12670 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
12680 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
12690 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
126a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
126b0 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
126c0 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
126d0 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
126e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
126f0 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
12700 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12720 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
12730 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
12740 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
12750 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
12760 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
12770 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
12780 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
12790 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
127a0 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
127b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
127c0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
127d0 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
127e0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
127f0 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
12800 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12810 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
12820 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
12830 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
12840 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12850 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12860 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
12870 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
12880 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
12890 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
128a0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
128b0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
128c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
128d0 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
128e0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
128f0 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
12900 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
12910 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
12920 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
12930 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
12940 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
12950 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
12960 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
12970 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
12980 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
12990 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
129a0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
129b0 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
129c0 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
129d0 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
129e0 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
129f0 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
12a00 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
12a10 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
12a20 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
12a30 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
12a40 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
12a50 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
12a60 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
12a70 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
12a80 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
12a90 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
12aa0 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
12ab0 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
12ac0 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
12ad0 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
12ae0 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
12af0 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
12b00 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
12b10 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
12b20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
12b30 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
12b40 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12b50 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
12b60 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
12b70 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
12b80 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
12b90 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12ba0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
12bb0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12bd0 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
12be0 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
12bf0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
12c00 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
12c10 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
12c20 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
12c30 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
12c40 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
12c50 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
12c60 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
12c70 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12c80 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
12c90 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  File);.#endif.. 
12ca0 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73   do{.    rc = os
12cb0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
12cc0 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69  e->h);.    /* Si
12cd0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12ce0 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53  c=0; cnt=MX_CLOS
12cf0 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f  E_ATTEMPT; ); */
12d00 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30  .  }while( rc==0
12d10 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43   && ++cnt < MX_C
12d20 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20  LOSE_ATTEMPT && 
12d30 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73  (sqlite3_win32_s
12d40 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
12d50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
12d60 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e  INCE.#define WIN
12d70 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
12d80 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65  MPTS 3.  winceDe
12d90 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29  stroyLock(pFile)
12da0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a  ;.  if( pFile->z
12db0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b  DeleteOnClose ){
12dc0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
12dd0 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20  ;.    while(.   
12de0 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65          osDelete
12df0 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65  FileW(pFile->zDe
12e00 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a  leteOnClose)==0.
12e10 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74          && osGet
12e20 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
12e30 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
12e40 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66  Close)!=0xffffff
12e50 66 66 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  ff.        && cn
12e60 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
12e70 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
12e80 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
12e90 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
12ea0 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
12eb0 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
12ec0 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
12ed0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12ee0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
12ef0 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
12f00 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
12f10 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
12f20 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  h = NULL;.  }.  
12f30 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
12f40 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
12f50 53 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  SE file=%p, rc=%
12f60 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
12f70 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
12f80 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
12f90 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a   rc ? SQLITE_OK.
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69              : wi
12fb0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
12fc0 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73  _IOERR_CLOSE, os
12fd0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c            "winCl
13000 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
13010 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
13020 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
13030 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
13040 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
13050 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
13060 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
13070 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
13080 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
13090 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
130a0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
130b0 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
130c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
130d0 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
130e0 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
130f0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
13100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13110 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
13120 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
13130 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13160 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
13170 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
13180 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
13190 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
131a0 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
131b0 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
131c0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
131d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
131e0 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
131f0 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76  .  OVERLAPPED ov
13200 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
13210 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
13220 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a   for ReadFile. *
13230 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  /.#endif.  winFi
13240 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
13250 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
13260 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
13270 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
132a0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
132b0 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69  from file */.  i
132c0 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20  nt nRetry = 0;  
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72  * Number of retr
132f0 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ys */..  assert(
13300 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
13310 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
13320 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
13330 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
13340 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
13350 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
13360 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
13370 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  D file=%p, buffe
13380 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
13390 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f   offset=%lld, lo
133a0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
133b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
133c0 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74  Buf, amt, offset
133d0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
133e0 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
133f0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
13400 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
13410 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
13420 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
13430 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
13440 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
13450 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
13460 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
13470 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
13480 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
13490 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
134a0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
134b0 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
134c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
134d0 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
134e0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
134f0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
13500 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
13510 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20  ACE(("READ-MMAP 
13520 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13530 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
13540 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
13550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
13570 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29  nt nCopy = (int)
13580 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  (pFile->mmapSize
13590 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20   - offset);.    
135a0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
135b0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
135c0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
135d0 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
135e0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
135f0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
13600 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
13610 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
13620 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
13630 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
13640 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13650 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
13660 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
13670 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 69  LAPPED).  if( wi
13680 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
13690 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
136a0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
136b0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
136c0 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65  E_FULL\n", pFile
136d0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
136e0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
136f0 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
13700 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
13710 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
13720 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ead, 0) ){.#else
13730 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c  .  memset(&overl
13740 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
13750 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
13760 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
13770 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
13780 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
13790 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
137a0 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
137b0 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
137c0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
137d0 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
137e0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
137f0 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
13800 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26   &overlapped) &&
13810 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c  .         osGetL
13820 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f  astError()!=ERRO
13830 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a  R_HANDLE_EOF ){.
13840 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44  #endif.    DWORD
13850 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13860 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  if( winRetryIoer
13870 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
13880 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
13890 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
138a0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
138b0 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
138c0 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
138d0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
138e0 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  _READ\n", pFile-
138f0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13900 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
13910 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
13920 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13940 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61           "winRea
13950 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
13960 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49  );.  }.  winLogI
13970 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20  oerr(nRetry);.  
13980 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44  if( nRead<(DWORD
13990 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55  )amt ){.    /* U
139a0 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
139b0 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
139c0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
139d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
139e0 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64  har*)pBuf)[nRead
139f0 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29  ], 0, amt-nRead)
13a00 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
13a10 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
13a20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
13a30 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69  ORT_READ\n", pFi
13a40 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
13a50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13a60 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
13a70 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ..  OSTRACE(("RE
13a80 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
13a90 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
13aa0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
13ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13ac0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
13ad0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
13ae0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
13af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
13b00 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
13b10 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
13b20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
13b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13b40 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  inWrite(.  sqlit
13b50 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
13b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
13b70 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  le to write into
13b80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
13b90 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
13ba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
13bb0 65 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  es to be written
13bc0 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13bf0 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74  of bytes to writ
13c00 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
13c10 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
13c20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
13c30 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74   into the file t
13c40 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
13c50 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  at */.){.  int r
13c60 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
13c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13c80 75 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20  ue if error has 
13c90 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66  occurred, else f
13ca0 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  alse */.  winFil
13cb0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
13cc0 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
13cd0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
13ce0 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d00 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69   Number of retri
13d10 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
13d20 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
13d30 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
13d40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
13d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13d60 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
13d70 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
13d80 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
13d90 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41  _FULL);..  OSTRA
13da0 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d  CE(("WRITE file=
13db0 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61  %p, buffer=%p, a
13dc0 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74  mount=%d, offset
13dd0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
13de0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
13df0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
13e00 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65  t, offset, pFile
13e10 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
13e20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
13e30 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
13e40 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
13e50 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
13e60 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
13e70 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
13e80 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
13e90 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
13ea0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
13eb0 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
13ec0 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
13ed0 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
13ee0 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
13ef0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
13f00 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
13f10 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
13f20 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
13f30 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  t], pBuf, amt);.
13f40 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
13f50 57 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d  WRITE-MMAP file=
13f60 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
13f70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
13f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13f90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
13fa0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
13fb0 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
13fc0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
13fd0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
13fe0 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
13ff0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
14000 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
14010 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
14020 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
14030 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
14040 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
14050 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
14060 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
14070 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
14080 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64  TE_OS_WINCE || d
14090 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
140a0 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
140b0 44 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65  D).  rc = winSee
140c0 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
140d0 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
140e0 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23  0 ){.#else.  {.#
140f0 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
14100 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
14110 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
14120 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
14130 44 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  D).    OVERLAPPE
14140 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
14150 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
14160 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
14170 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
14180 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
14190 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
141a0 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
141b0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
141c0 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
141f0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
14200 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
14210 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
14220 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
14230 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
14240 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
14250 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
14260 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
14270 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
14280 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
14290 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
142a0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
142b0 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
142c0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
142d0 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d  VERLAPPED).    m
142e0 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
142f0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
14300 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
14310 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
14320 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
14330 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
14340 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
14350 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
14360 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
14370 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
14380 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65  endif..    while
14390 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20  ( nRem>0 ){.#if 
143a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
143b0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
143c0 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
143d0 41 50 50 45 44 29 0a 20 20 20 20 20 20 69 66 28  APPED).      if(
143e0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
143f0 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
14400 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
14410 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
14420 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
14430 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
14440 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
14450 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
14460 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
14470 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
14480 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72  &nRetry, &lastEr
14490 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rno) ) continue;
144a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
144b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
144c0 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20  sert( nWrite==0 
144d0 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52  || nWrite<=(DWOR
144e0 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20  D)nRem );.      
144f0 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  if( nWrite==0 ||
14500 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e   nWrite>(DWORD)n
14510 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Rem ){.        l
14520 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14530 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14550 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
14560 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
14570 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
14580 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
14590 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
145a0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
145b0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
145c0 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
145d0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
145e0 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
145f0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
14600 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
14610 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
14620 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
14630 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
14640 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
14650 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
14660 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
14670 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
14680 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
14690 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
146a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
146b0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
146c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
146d0 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
146e0 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
146f0 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
14700 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
14710 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
14720 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
14730 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
14740 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
14750 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
14760 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
14770 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c  rror(SQLITE_FULL
14780 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
14790 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
147b0 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d  nWrite1", pFile-
147c0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
147d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
147e0 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
147f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
14800 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  E\n", pFile->h))
14810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
14820 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14830 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
14840 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32        "winWrite2
14870 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
14890 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
148a0 79 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  y);.  }.  OSTRAC
148b0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
148c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
148d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
148e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
148f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
14900 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
14910 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
14920 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
14930 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
14940 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14950 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
14960 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
14970 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
14980 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
14990 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
149a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
149b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
149c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
149d0 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
149e0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52  nction */.  DWOR
149f0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
14a00 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14a10 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
14a20 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
14a30 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29  _IOERR_TRUNCATE)
14a40 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ;.  OSTRACE(("TR
14a50 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20  UNCATE file=%p, 
14a60 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  size=%lld, lock=
14a70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
14a80 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74    pFile->h, nByt
14a90 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
14aa0 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pe));..  /* If t
14ab0 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
14ac0 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
14ad0 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
14ae0 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
14af0 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
14b00 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
14b10 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
14b20 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
14b30 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
14b40 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
14b50 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
14b60 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
14b70 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
14b80 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
14b90 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14ba0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
14bb0 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
14bc0 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
14bd0 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
14be0 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
14bf0 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
14c00 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
14c10 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
14c20 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
14c30 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
14c40 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
14c50 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
14c60 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
14c70 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
14c80 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
14c90 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
14ca0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
14cd0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
14ce0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30  );.  }else if( 0
14cf0 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  ==osSetEndOfFile
14d00 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20  (pFile->h) &&.  
14d10 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74            ((last
14d20 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
14d30 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
14d40 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c  _USER_MAPPED_FIL
14d50 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
14d60 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
14d70 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
14d80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14d90 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
14da0 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
14db0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14dc0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
14dd0 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65  runcate2", pFile
14de0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23  ->zPath);.  }..#
14df0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
14e00 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49  AP_SIZE>0.  /* I
14e10 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74  f the file was t
14e20 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
14e30 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
14e40 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
14e50 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
14e60 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
14e70 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
14e80 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
14e90 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73  ite will.  ** us
14ea0 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
14eb0 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
14ec0 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
14ed0 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
14ee0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  n..  */.  if( pF
14ef0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
14f00 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  && nByte<pFile->
14f10 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14f20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14f30 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e  = nByte;.  }.#en
14f40 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
14f50 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25  "TRUNCATE file=%
14f60 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
14f70 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
14f80 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
14f90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14fa0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
14fb0 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
14fc0 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
14fd0 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
14fe0 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
14ff0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
15000 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
15010 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
15020 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
15030 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
15040 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
15050 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
15060 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
15070 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
15080 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
15090 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
150a0 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
150b0 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
150c0 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
150d0 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
150e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
150f0 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
15100 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
15110 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
15120 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
15130 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
15140 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
15150 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
15160 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
15170 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
15180 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
15190 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
151a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
151b0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
151c0 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
151d0 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
151e0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
151f0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
15200 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
15210 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
15220 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
15230 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
15240 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
15250 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
15260 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
15270 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
15280 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15290 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
152a0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
152b0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
152c0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
152d0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
152e0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
152f0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
15300 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
15310 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
15320 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
15330 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
15340 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
15350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
15360 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
15370 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
15380 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
15390 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
153a0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
153b0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
153c0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
153d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
153e0 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
153f0 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
15400 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
15410 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
15420 20 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67    pFile->h, flag
15430 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  s, pFile->lockty
15440 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  pe));..#ifndef S
15450 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55  QLITE_TEST.  UNU
15460 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c  SED_PARAMETER(fl
15470 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ags);.#else.  if
15480 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  ( (flags&0x0F)==
15490 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
154a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
154b0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
154c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
154d0 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
154e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
154f0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
15500 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
15510 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
15520 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
15530 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
15540 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
15550 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15560 2d 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  -NOP file=%p, rc
15570 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
15580 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
15590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
155a0 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c  else.  rc = osFl
155b0 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
155c0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75  File->h);.  Simu
155d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
155e0 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72  FALSE );.  if( r
155f0 63 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  c ){.    OSTRACE
15600 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
15610 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
15620 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15640 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
15650 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15660 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
15670 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  or();.    OSTRAC
15680 45 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70  E(("SYNC file=%p
15690 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
156a0 52 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c  R_FSYNC\n", pFil
156b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
156c0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
156d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
156e0 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  C, pFile->lastEr
156f0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15700 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15710 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
15720 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
15730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
15740 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
15750 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
15760 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
15770 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
15780 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
15790 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
157a0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
157b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
157c0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
157d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
157e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
157f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15800 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
15810 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
15820 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15830 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
15840 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
15850 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
15860 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
15870 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
15880 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
15890 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
158a0 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
158b0 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
158c0 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
158d0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
158e0 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
15920 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
15930 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
15940 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
15950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15960 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15970 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15980 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
15990 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
159a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
159b0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
159c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
159d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
159e0 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
159f0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
15a00 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
15a10 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
15a20 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
15a30 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
15a40 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
15a50 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
15a60 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
15a70 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
15a80 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
15a90 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
15aa0 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
15ab0 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
15ac0 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
15ad0 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
15ae0 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
15af0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
15b00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
15b10 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
15b20 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
15b30 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
15b40 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
15b50 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
15b60 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
15b70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15b90 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
15ba0 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
15bb0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
15bc0 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
15bd0 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
15be0 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
15bf0 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
15c00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
15c10 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
15c20 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
15c30 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
15c40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15c50 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
15c60 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
15c70 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
15c80 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
15c90 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
15ca0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15cb0 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
15cc0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
15cd0 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
15ce0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
15cf0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
15d00 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
15d10 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
15d20 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
15d30 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
15d40 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
15d50 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
15d60 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
15d70 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
15d80 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
15d90 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
15da0 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
15db0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
15dc0 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
15dd0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
15de0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
15df0 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
15e00 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
15e10 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
15e20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
15e30 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
15e40 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
15e50 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
15e60 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
15e70 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
15e80 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
15e90 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
15ea0 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
15eb0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15ec0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
15ed0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
15ee0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
15ef0 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
15f00 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
15f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
15f40 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
15f50 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
15f60 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
15f70 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
15f80 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
15f90 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
15fa0 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
15fb0 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
15fc0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
15fd0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
15fe0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15ff0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
16000 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
16010 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
16020 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
16030 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
16040 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
16050 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
16060 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
16070 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
16080 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
16090 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
160a0 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
160b0 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
160c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
160d0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
160e0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
160f0 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
16100 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
16110 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
16120 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16130 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
16140 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
16150 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
16160 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
16170 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
16180 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
16190 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
161a0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
161b0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
161c0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
161d0 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
161e0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
161f0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16200 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
16210 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
16220 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
16230 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16240 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16250 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
16260 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16290 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
162a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
162b0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
162c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
162d0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
162e0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
162f0 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
16300 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
16310 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
16320 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
16330 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
16340 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
16350 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16360 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
16370 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
163a0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
163b0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
163c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
163d0 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
163e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
163f0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16400 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
16410 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
16420 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
16430 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
16440 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
16450 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
16460 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
16470 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
16480 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
16490 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
164a0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
164b0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
164c0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
164d0 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
164e0 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
164f0 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
16500 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
16510 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16520 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
16530 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
16540 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
16550 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
16560 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
16570 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
16580 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
16590 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
165a0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
165b0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
165c0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
165d0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
165e0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
165f0 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
16600 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
16610 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
16620 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16630 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
16640 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
16650 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
16660 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
16670 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
16680 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16690 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
166a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
166c0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  nUnlockReadLock"
166d0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
166e0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
166f0 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
16700 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c  e=%p, result=%d\
16710 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
16720 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  s));.  return re
16730 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
16740 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
16750 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
16760 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
16770 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
16780 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16790 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
167a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
167b0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
167c0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
167d0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
167e0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
167f0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
16800 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
16810 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
16820 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
16830 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
16840 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
16850 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
16860 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
16870 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
16880 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
16890 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
168a0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
168b0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
168c0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
168d0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
168e0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
168f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
16900 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
16910 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
16920 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
16930 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
16940 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
16950 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
16960 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
16970 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
16980 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
16990 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
169a0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
169b0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
169c0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
169d0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
169e0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
169f0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
16a00 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
16a10 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
16a20 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
16a30 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
16a40 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
16a50 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
16a60 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
16a70 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
16a80 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
16a90 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
16aa0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
16ab0 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
16ac0 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
16ad0 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
16ae0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
16af0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
16b00 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16b10 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
16b20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16b30 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
16b40 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
16b50 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
16b60 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
16b70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
16b80 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c  t of a Windows l
16b90 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
16ba0 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
16bb0 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
16bc0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
16bd0 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
16be0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
16bf0 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
16c00 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
16c10 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
16c20 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
16c30 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
16c40 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
16c50 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
16c60 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
16c70 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
16c80 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
16c90 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65  RACE(("LOCK file
16ca0 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
16cb0 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
16cc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
16cd0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
16ce0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
16cf0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
16d00 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20   locktype));..  
16d10 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
16d20 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
16d30 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
16d40 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
16d50 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
16d60 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
16d70 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
16d80 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
16d90 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
16da0 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
16db0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
16dc0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
16dd0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
16de0 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
16df0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16e00 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c  CK-HELD file=%p,
16e10 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
16e20 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
16e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e40 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
16e50 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
16e60 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
16e70 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
16e80 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
16e90 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
16ea0 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
16eb0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
16ec0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
16ed0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
16ee0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
16ef0 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
16f00 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
16f10 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
16f20 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
16f30 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
16f40 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
16f50 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
16f60 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
16f70 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
16f80 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
16f90 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
16fa0 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
16fb0 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
16fc0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
16fd0 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
16fe0 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
16ff0 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
17000 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20  cktype;.  if(   
17010 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
17020 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ==NO_LOCK).     
17030 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65  || (   (locktype
17040 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17050 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
17060 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
17070 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a  RESERVED_LOCK)).
17080 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
17090 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
170a0 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
170b0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
170c0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
170d0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
170e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
17110 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
17120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
17130 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
17140 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
17150 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  lock.  This is n
17160 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20  eeded to work.  
17170 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72      ** around pr
17180 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
17190 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72   indexing and/or
171a0 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74   anti-virus soft
171b0 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a  ware on.      **
171c0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
171d0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f  ..      ** If yo
171e0 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  u are using this
171f0 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c   code as a model
17200 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65   for alternative
17210 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20   VFSes, do not. 
17220 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69       ** copy thi
17230 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20  s retry logic.  
17240 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74  It is a hack int
17250 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  ended for Window
17260 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  s only..      */
17270 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
17280 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17290 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
172a0 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
172b0 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
172c0 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74  count=%d, result
172d0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
172e0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
172f0 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20   cnt, res));.   
17300 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
17310 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f  ==ERROR_INVALID_
17320 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20  HANDLE ){.      
17330 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17340 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
17350 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17360 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
17370 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
17380 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
17390 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72  =%p, count=%d, r
173a0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
173b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
173c0 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33  >h, cnt, sqlite3
173d0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
173e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
173f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17400 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65  if( cnt ) sqlite
17410 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29  3_win32_sleep(1)
17420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
17430 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
17440 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
17450 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
17460 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
17470 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
17480 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
17490 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
174a0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
174b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
174c0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
174d0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
174e0 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
174f0 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52     res = winGetR
17500 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
17510 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
17520 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
17530 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
17540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17550 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
17560 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
17570 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
17580 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
17590 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  D lock.  */.  if
175a0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ( locktype==RESE
175b0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  RVED_LOCK && res
175c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
175d0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
175e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
175f0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
17600 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17610 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17620 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44  _FLAGS, RESERVED
17630 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
17640 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
17650 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
17660 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
17670 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
17680 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
17690 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
176a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
176b0 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
176c0 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
176d0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
176e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
176f0 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
17700 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
17710 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
17720 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
17730 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
17740 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
17750 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
17760 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
17770 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
17780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
17790 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
177a0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
177b0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
177c0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
177d0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
177e0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
177f0 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
17800 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  E_FLAGS, SHARED_
17810 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
17840 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
17850 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
17860 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
17870 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
17880 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
17890 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
178a0 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52  );.      winGetR
178b0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
178c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
178d0 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
178e0 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
178f0 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
17900 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
17910 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
17920 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
17930 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
17940 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
17950 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17960 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17970 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
17980 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
17990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
179a0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
179b0 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
179c0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
179d0 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
179e0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
179f0 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
17a00 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
17a10 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
17a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
17a30 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
17a40 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
17a50 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
17a60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
17a70 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
17a80 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61  FAIL file=%p, wa
17a90 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c  nted=%d, got=%d\
17aa0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17ab0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
17ac0 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
17ad0 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  ));.  }.  pFile-
17ae0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
17af0 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f  newLocktype;.  O
17b00 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
17b10 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
17b20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
17b30 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
17b40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
17b50 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
17b60 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
17b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
17b80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
17b90 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
17ba0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
17bb0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
17bc0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
17bd0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
17be0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
17bf0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
17c00 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
17c10 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
17c20 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
17c30 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
17c40 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
17c50 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
17c60 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65  esOut){.  int re
17c70 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  s;.  winFile *pF
17c80 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
17c90 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
17ca0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
17cb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
17cc0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
17cd0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
17ce0 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
17cf0 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e  %p, pResOut=%p\n
17d00 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65  ", pFile->h, pRe
17d10 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72  sOut));..  asser
17d20 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
17d30 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
17d40 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
17d50 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b   ){.    res = 1;
17d60 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
17d70 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
17d80 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28  =%p, result=%d (
17d90 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
17da0 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65  ->h, res));.  }e
17db0 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  lse{.    res = w
17dc0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
17dd0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
17de0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
17df0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
17e00 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
17e10 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  es ){.      winU
17e20 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
17e30 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
17e40 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
17e50 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72    }.    res = !r
17e60 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  es;.    OSTRACE(
17e70 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
17e80 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
17e90 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
17ea0 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
17eb0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
17ec0 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28   res;.  OSTRACE(
17ed0 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
17ee0 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
17ef0 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
17f00 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17f10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
17f20 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20  le->h, pResOut, 
17f30 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65  *pResOut));.  re
17f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17f50 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
17f60 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
17f70 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
17f80 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
17f90 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
17fa0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
17fb0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
17fc0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
17fd0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
17fe0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
17ff0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
18000 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
18010 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
18020 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
18030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18040 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
18050 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
18060 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
18070 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
18080 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
18090 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
180a0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
180b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
180c0 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
180d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
180e0 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
180f0 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
18100 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
18110 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18120 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
18130 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
18140 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
18150 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
18160 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18170 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
18180 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
18190 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
181a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
181b0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
181c0 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63   file=%p, oldLoc
181d0 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63  k=%d(%d), newLoc
181e0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
181f0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
18200 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
18210 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
18220 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29  Byte, locktype))
18230 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
18240 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
18250 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
18260 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  E_LOCK ){.    wi
18270 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
18280 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
18290 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
182a0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
182b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
182c0 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65  D_LOCK && !winGe
182d0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
182e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
182f0 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
18300 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
18310 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
18320 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
18330 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
18340 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
18350 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
18360 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
18370 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
18380 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
183a0 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  nUnlock", pFile-
183b0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
183c0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
183d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
183e0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
183f0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
18400 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
18410 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
18420 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
18430 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
18440 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
18450 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
18460 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
18470 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
18480 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
18490 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
184a0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
184b0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
184c0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
184d0 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
184e0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  e;.  OSTRACE(("U
184f0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
18500 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
18510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
18520 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
18530 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
18540 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
18550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18560 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
18570 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
18580 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
18590 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
185a0 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
185b0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
185c0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
185d0 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
185e0 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
185f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
18600 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
18610 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
18620 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
18630 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
18640 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
18650 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c  inModeBit(winFil
18660 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
18670 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
18680 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
18690 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
186a0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
186b0 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
186c0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
186d0 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
186e0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
186f0 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
18700 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
18710 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
18720 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
18730 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
18740 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20  s to VFS helper 
18750 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72  methods used for
18760 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
18770 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
18780 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  inGetTempname(sq
18790 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61  lite3_vfs *, cha
187a0 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  r **);.static in
187b0 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
187c0 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
187d0 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65   BOOL winIsDrive
187e0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63  LetterAndColon(c
187f0 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f  onst char *);../
18800 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
18810 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
18820 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
18830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18840 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
18850 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
18860 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
18870 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
18880 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
18890 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  )id;.  OSTRACE((
188a0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
188b0 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e  op=%d, pArg=%p\n
188c0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c  ", pFile->h, op,
188d0 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63   pArg));.  switc
188e0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
188f0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
18900 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
18910 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
18920 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
18930 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18940 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18950 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
18960 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
18970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18980 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
18990 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
189a0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
189b0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
189c0 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
189d0 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  no;.      OSTRAC
189e0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
189f0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
18a00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18a20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18a30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18a40 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
18a50 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
18a60 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
18a70 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54  )pArg;.      OST
18a80 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18a90 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
18aa0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
18ab0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18ad0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18ae0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
18af0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
18b00 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
18b10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18b20 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
18b30 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
18b40 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
18b50 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
18b60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18b80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
18b90 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
18ba0 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
18bb0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
18bc0 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
18bd0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18be0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
18c00 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
18c10 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
18c20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18c30 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18c40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18c50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54     }.        OST
18c60 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18c70 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
18c80 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
18c90 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
18ca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18cb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18cc0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18cd0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18ce0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18cf0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18d10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18d20 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
18d30 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
18d40 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
18d50 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
18d60 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
18d70 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
18d80 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
18d90 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
18da0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18db0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18dc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18dd0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18de0 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
18df0 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
18e00 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
18e10 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
18e20 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
18e30 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18e40 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18e50 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18e60 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
18e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18e90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
18ea0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
18eb0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
18ec0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
18ed0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
18ee0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
18ef0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
18f00 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
18f10 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
18f20 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
18f30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18f40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
18f50 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
18f60 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20  AV_RETRY: {.    
18f70 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a    int *a = (int*
18f80 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
18f90 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[0]>0 ){.     
18fa0 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
18fb0 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
18fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
18fd0 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74  0] = winIoerrRet
18fe0 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ry;.      }.    
18ff0 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a    if( a[1]>0 ){.
19000 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
19010 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31  RetryDelay = a[1
19020 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
19030 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77          a[1] = w
19040 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
19050 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
19060 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
19070 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
19080 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
19090 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
190a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
190b0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
190c0 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65  TE_TEST.    case
190d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
190e0 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20  N32_SET_HANDLE: 
190f0 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45  {.      LPHANDLE
19100 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e   phFile = (LPHAN
19110 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20  DLE)pArg;.      
19120 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20  HANDLE hOldFile 
19130 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
19140 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68    pFile->h = *ph
19150 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46  File;.      *phF
19160 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a  ile = hOldFile;.
19170 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
19180 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70  FCNTL oldFile=%p
19190 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63  , newFile=%p, rc
191a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4f                hO
191c0 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  ldFile, pFile->h
191d0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
191e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
191f0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
19200 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
19210 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
19220 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
19230 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
19240 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
19250 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
19260 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
19270 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
19290 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
192a0 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
192b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
192c0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
192d0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
192e0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
192f0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
19300 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
19310 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
19320 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
19330 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
19340 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
19350 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
19360 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
19370 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
19380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
19390 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
193a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
193b0 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
193c0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
193d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
193e0 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
193f0 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
19400 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
19410 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
19420 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
19430 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
19440 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
19450 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
19460 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
19470 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19480 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
19490 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
194a0 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
194b0 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e  .          winUn
194c0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
194d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
194e0 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  inMapfile(pFile,
194f0 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
19500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
19510 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19520 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
19530 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
19540 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
19550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19560 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
19570 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46   }.  OSTRACE(("F
19580 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19590 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
195a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
195b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
195c0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
195d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
195e0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
195f0 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
19600 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
19610 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
19620 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
19630 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
19640 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
19650 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
19660 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
19670 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
19680 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
19690 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
196a0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
196b0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
196c0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
196d0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
196e0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
196f0 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
19700 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
19710 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
19720 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
19730 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
19740 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
19750 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
19760 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
19770 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
19780 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
19790 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
197a0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
197b0 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
197c0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
197d0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
197e0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
197f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19800 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
19810 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
19820 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
19830 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
19840 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
19850 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
19860 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
19870 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
19880 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
19890 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
198a0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
198b0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
198c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .}../*.** Window
198d0 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20  s will only let 
198e0 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20  you create file 
198f0 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a  view mappings.**
19900 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73   on allocation s
19910 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ize granularity 
19920 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44  boundaries..** D
19930 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73  uring sqlite3_os
19940 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20  _init() we do a 
19950 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a  GetSystemInfo().
19960 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72  ** to get the gr
19970 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a  anularity size..
19980 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45 4d  */.static SYSTEM
19990 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f  _INFO winSysInfo
199a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
199b0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a  E_OMIT_WAL../*.*
199c0 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
199d0 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
199e0 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
199f0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
19a00 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
19a10 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
19a20 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b  tect the winLock
19a30 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65  Info objects use
19a40 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c  d by.** this fil
19a50 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
19a60 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79  may be shared by
19a70 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
19a80 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
19a90 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  n winShmMutexHel
19aa0 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
19ab0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
19ac0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a   global mutex.**
19ad0 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
19ae0 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
19af0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
19b00 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
19b10 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
19b20 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
19b30 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
19b40 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
19b50 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
19b60 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
19b70 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
19b80 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
19b90 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
19ba0 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
19bb0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
19bc0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
19bd0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
19be0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
19bf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
19c00 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
19c10 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
19c20 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
19c30 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
19c40 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
19c50 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
19c60 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
19c70 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74  ic int winShmMut
19c80 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
19c90 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
19ca0 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
19cb0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
19cc0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
19cd0 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e  _MASTER));.}.#en
19ce0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  dif../*.** Objec
19cf0 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
19d00 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  ent a single fil
19d10 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61  e opened and mma
19d20 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a  pped to provide.
19d30 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ** shared memory
19d40 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .  When multiple
19d50 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
19d60 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a  erence the same.
19d70 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20  ** log-summary, 
19d80 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
19d90 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20  its own winFile 
19da0 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
19db0 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
19dc0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
19dd0 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
19de0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
19df0 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
19e00 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
19e10 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
19e20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77  process..**.** w
19e30 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
19e40 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
19e50 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
19e60 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
19e70 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
19e80 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
19e90 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
19ea0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
19eb0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20        nRef.**   
19ec0 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54     pNext.**.** T
19ed0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
19ee0 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
19ef0 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
19f00 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
19f10 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a  *.**      fid.**
19f20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
19f30 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
19f40 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
19f50 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
19f60 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
19f70 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
19f80 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
19f90 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
19fa0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
19fb0 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
19fc0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
19fd0 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
19fe0 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
19ff0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1a000 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1a010 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1a020 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1a030 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1a040 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a050 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
1a060 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
1a070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a080 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
1a090 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
1a0a0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
1a0b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a0c0 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
1a0d0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1a0e0 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
1a0f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a100 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
1a110 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
1a120 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
1a130 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
1a140 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
1a150 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
1a160 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
1a170 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
1a180 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
1a190 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1a1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a1b0 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
1a1c0 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
1a1d0 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
1a1e0 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1a1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a200 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
1a210 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
1a220 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
1a230 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
1a240 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
1a250 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1a260 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1a270 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
1a280 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
1a290 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
1a2a0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
1a2b0 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66  bjects */.#ifdef
1a2c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a2d0 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
1a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a2f0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e  xt available win
1a300 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
1a310 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
1a320 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20   A global array 
1a330 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
1a340 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
1a350 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78   The winShmMutex
1a360 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
1a370 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e  rue while readin
1a380 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69  g or writing thi
1a390 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  s list..*/.stati
1a3a0 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69  c winShmNode *wi
1a3b0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30  nShmNodeList = 0
1a3c0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
1a3d0 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
1a3e0 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
1a3f0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
1a400 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
1a410 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
1a420 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
1a430 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1a440 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
1a450 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
1a460 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
1a470 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
1a480 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
1a490 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53  r:.**.**    winS
1a4a0 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20  hm.pShmNode.**  
1a4b0 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a    winShm.id.**.*
1a4c0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
1a4d0 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
1a4e0 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70  e.  The winShm.p
1a4f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d  ShmNode->mutex m
1a500 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
1a510 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
1a520 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
1a530 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
1a540 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68  winShm {.  winSh
1a550 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1a560 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
1a570 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  erlying winShmNo
1a580 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77  de object */.  w
1a590 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  inShm *pNext;   
1a5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
1a5b0 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68  t winShm with th
1a5c0 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64  e same winShmNod
1a5d0 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
1a5e0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1a5f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
1a600 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e  ding the winShmN
1a610 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
1a620 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
1a630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1a640 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
1a650 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
1a660 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
1a670 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1a680 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
1a690 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66  s held */.#ifdef
1a6a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a6b0 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
1a6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
1a6d0 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
1a6e0 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
1a6f0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
1a700 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
1a710 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
1a720 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
1a730 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
1a740 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
1a750 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
1a760 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
1a770 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
1a780 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
1a790 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
1a7a0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
1a7b0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
1a7c0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
1a7d0 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
1a7e0 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
1a7f0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
1a800 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  st..*/.#define _
1a810 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
1a820 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
1a830 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
1a840 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
1a850 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
1a860 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
1a870 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
1a880 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
1a890 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
1a8a0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
1a8b0 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
1a8c0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
1a8d0 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
1a8e0 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
1a8f0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
1a900 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
1a910 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
1a920 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
1a930 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
1a940 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
1a950 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a960 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
1a970 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
1a980 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1a990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a9a0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
1a9b0 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
1a9c0 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
1a9d0 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
1a9e0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1a9f0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1aa00 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1aa10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1aa20 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
1aa30 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
1aa40 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53  nRef==0 );..  OS
1aa50 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1aa60 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
1aa70 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
1aa80 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ze=%d\n",.      
1aa90 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
1aaa0 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f  e.h, lockType, o
1aab0 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20  fst, nByte));.. 
1aac0 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
1aad0 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
1aae0 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
1aaf0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
1ab00 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
1ab10 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  c = winUnlockFil
1ab20 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
1ab30 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  h, ofst, 0, nByt
1ab40 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
1ab50 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1ab60 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
1ab70 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
1ab80 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20  DWORD dwFlags = 
1ab90 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
1aba0 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69  MEDIATELY;.    i
1abb0 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
1abc0 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
1abd0 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
1abe0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
1abf0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
1ac00 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
1ac10 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f  le.h, dwFlags, o
1ac20 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
1ac30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
1ac40 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  != 0 ){.    rc =
1ac50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
1ac60 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
1ac70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47  lastErrno =  osG
1ac80 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1ac90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1aca0 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  USY;.  }..  OSTR
1acb0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66  ACE(("SHM-LOCK f
1acc0 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c  ile=%p, func=%s,
1acd0 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25   errno=%lu, rc=%
1ace0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1acf0 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
1ad00 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53   (lockType == _S
1ad10 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e  HM_UNLCK) ? "win
1ad20 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20  UnlockFile" :.  
1ad30 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63           "winLoc
1ad40 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c  kFile", pFile->l
1ad50 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65  astErrno, sqlite
1ad60 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1ad70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ad80 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
1ad90 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
1ada0 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1adb0 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
1adc0 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
1add0 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
1ade0 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
1adf0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
1ae00 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
1ae10 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
1ae20 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
1ae30 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
1ae40 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
1ae50 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
1ae60 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
1ae70 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
1ae80 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
1ae90 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
1aea0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
1aeb0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
1aec0 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
1aed0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
1aee0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1aef0 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
1af00 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1af10 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
1af20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
1af30 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1af40 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
1af50 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
1af60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1af70 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c 20  -PURGE pid=%lu, 
1af80 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22  deleteFlag=%d\n"
1af90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1afa0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1afb0 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61 67  Id(), deleteFlag
1afc0 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53  ));.  pp = &winS
1afd0 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68  hmNodeList;.  wh
1afe0 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d  ile( (p = *pp)!=
1aff0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
1b000 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
1b010 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
1b020 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71  ( p->mutex ){ sq
1b030 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1b040 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20  (p->mutex); }.  
1b050 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1b060 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
1b070 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62 52  .        BOOL bR
1b080 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f  c = osUnmapViewO
1b090 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  fFile(p->aRegion
1b0a0 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20  [i].pMap);.     
1b0b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1b0c0 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69 64  -PURGE-UNMAP pid
1b0d0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1b0e0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1b100 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1b110 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
1b120 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1b130 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
1b140 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
1b150 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63  Rc);.        bRc
1b160 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   = osCloseHandle
1b170 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68  (p->aRegion[i].h
1b180 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
1b190 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1b1a0 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c  E-CLOSE pid=%lu,
1b1b0 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
1b1c0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1b1d0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1b1e0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1b1f0 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
1b200 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1b210 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41      UNUSED_VARIA
1b220 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a  BLE_VALUE(bRc);.
1b230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b240 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55  ( p->hFile.h!=NU
1b250 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68  LL && p->hFile.h
1b260 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
1b270 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
1b280 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b290 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1b2a0 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71      winClose((sq
1b2b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d  lite3_file *)&p-
1b2c0 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  >hFile);.       
1b2d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b2e0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1b2f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
1b300 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  eteFlag ){.     
1b310 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1b320 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1b330 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
1b340 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
1b350 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65  .        winDele
1b360 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c  te(pVfs, p->zFil
1b370 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  ename, 0);.     
1b380 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
1b390 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1b3a0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1b3b0 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1b3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
1b3d0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
1b3e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b3f0 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20  p->aRegion);.   
1b400 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b410 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
1b420 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e       pp = &p->pN
1b430 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
1b440 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
1b450 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1b460 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
1b470 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ith database fil
1b480 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57  e pDbFd..**.** W
1b490 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
1b4a0 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
1b4b0 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
1b4c0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
1b4d0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
1b4e0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
1b4f0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
1b500 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
1b510 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
1b520 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
1b530 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1b540 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
1b550 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
1b560 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1b570 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64  nt winOpenShared
1b580 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a  Memory(winFile *
1b590 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
1b5a0 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5c0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1b5d0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
1b5e0 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
1b5f0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de *pShmNode = 0
1b600 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1b610 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
1b620 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b650 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73  sult code */.  s
1b660 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1b670 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
1b680 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
1b690 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ated winShmNode 
1b6a0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b6d0 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65  of zName in byte
1b6e0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1b6f0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1b700 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76  ;    /* Not prev
1b710 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f  iously opened */
1b720 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1b730 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
1b740 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62  w sqlite3_shm ob
1b750 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63  ject.  Also spec
1b760 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61  ulatively.  ** a
1b770 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
1b780 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f  r a new winShmNo
1b790 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e  de and filename.
1b7a0 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
1b7b0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
1b7c0 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
1b7d0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1b7e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1b7f0 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  MEM;.  nName = s
1b800 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
1b810 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1b820 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61  pNew = sqlite3Ma
1b830 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
1b840 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e  (*pShmNode) + nN
1b850 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66  ame + 17 );.  if
1b860 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1b870 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1b880 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b890 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b8a0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  .  }.  pNew->zFi
1b8b0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
1b8c0 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
1b8d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
1b8e0 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
1b8f0 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
1b900 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1b910 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
1b920 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
1b930 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
1b940 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ame);..  /* Look
1b950 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
1b960 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
1b970 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
1b980 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
1b990 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
1b9a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
1b9b0 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
1b9c0 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
1b9d0 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
1b9e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
1b9f0 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
1ba00 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
1ba10 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
1ba20 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
1ba30 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
1ba40 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
1ba50 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
1ba60 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
1ba70 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
1ba80 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
1ba90 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
1baa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1bab0 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
1bac0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
1bad0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
1bae0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1baf0 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
1bb00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1bb10 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
1bb20 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
1bb30 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
1bb40 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
1bb50 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
1bb60 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
1bb70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
1bb80 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
1bb90 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
1bba0 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
1bbb0 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
1bbc0 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e  Node;..    pShmN
1bbd0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
1bbe0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1bbf0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
1bc00 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
1bc10 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
1bc20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1bc30 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1bc40 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1bc50 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1bc60 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  ..    rc = winOp
1bc70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a  en(pDbFd->pVfs,.
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1bca0 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  name,           
1bcb0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1bcc0 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
1bcd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bce0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
1bcf0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1bd00 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  e,  /* File hand
1bd10 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20  le here */.     
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1bd30 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51  TE_OPEN_WAL | SQ
1bd40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1bd50 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
1bd60 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20  N_CREATE,.      
1bd70 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
1bd80 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1bd90 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  !=rc ){.      go
1bda0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1bdb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1bdc0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1bdd0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1bde0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1bdf0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1be00 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
1be10 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1be20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a  to zero length..
1be30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77      */.    if( w
1be40 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1be50 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
1be60 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  RLCK, WIN_SHM_DM
1be70 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
1be80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1be90 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
1bea0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1beb0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b  Node->hFile, 0);
1bec0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1bed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bee0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1bef0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1bf00 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
1bf10 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68        "winOpenSh
1bf40 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
1bf50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bf60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bf70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bf80 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1bf90 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1bfa0 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
1bfb0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63  MS, 1);.      rc
1bfc0 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1bfd0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1bfe0 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_RDLCK, WIN_SH
1bff0 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d  M_DMS, 1);.    }
1c000 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1c010 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1c020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
1c030 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
1c040 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
1c050 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
1c060 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
1c070 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
1c080 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c090 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
1c0a0 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
1c0b0 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
1c0c0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
1c0d0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77  d->pShm = p;.  w
1c0e0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1c0f0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
1c100 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
1c110 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
1c120 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
1c130 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
1c140 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
1c150 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  e winShmEnterMut
1c160 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
1c170 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
1c180 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
1c190 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a  ruct winShm) obj
1c1a0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
1c1b0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
1c1c0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
1c1d0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
1c1e0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
1c1f0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
1c200 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
1c210 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
1c220 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
1c230 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
1c240 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
1c250 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
1c260 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  tex.  ** mutex..
1c270 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1c280 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1c290 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
1c2a0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
1c2b0 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
1c2c0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
1c2d0 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
1c2e0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
1c2f0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
1c300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c310 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1c320 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
1c330 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
1c340 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1c350 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1c360 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
1c370 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d  MS, 1);.  winShm
1c380 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
1c390 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54  s, 0);      /* T
1c3a0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
1c3b0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
1c3c0 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
1c3d0 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69  _free(p);.  sqli
1c3e0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
1c3f0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1c400 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
1c410 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
1c420 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
1c430 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
1c440 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
1c450 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61  erlying.** stora
1c460 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
1c470 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
1c480 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
1c490 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
1c4a0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1c4b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1c4c0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1c4d0 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
1c4e0 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
1c4f0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
1c500 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
1c510 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
1c520 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
1c530 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1c540 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
1c550 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1c560 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
1c570 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1c580 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
1c590 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1c5a0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
1c5b0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
1c5c0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
1c5d0 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
1c5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1c5f0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
1c600 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1c610 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
1c620 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
1c630 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1c640 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1c650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c660 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1c670 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
1c680 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
1c690 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
1c6a0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
1c6b0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
1c6c0 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
1c6d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c6e0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1c6f0 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
1c700 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
1c710 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
1c720 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
1c730 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
1c740 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
1c750 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1c760 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
1c770 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
1c780 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
1c790 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1c7a0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c7b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
1c7c0 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
1c7d0 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
1c7e0 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
1c7f0 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
1c800 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
1c810 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1c820 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
1c830 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
1c840 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
1c850 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
1c860 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1c870 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
1c880 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
1c890 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
1c8a0 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
1c8b0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
1c8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c8d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1c8e0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
1c8f0 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
1c900 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
1c910 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1c920 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
1c930 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1c940 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
1c950 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1c960 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1c970 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c990 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
1c9a0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
1c9b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1c9e0 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
1c9f0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
1ca00 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
1ca10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
1ca20 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
1ca30 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
1ca40 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
1ca50 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
1ca60 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1ca70 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
1ca80 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
1ca90 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
1caa0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
1cab0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
1cac0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
1cad0 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
1cae0 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1cb10 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
1cb20 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
1cb30 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
1cb40 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
1cb50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb70 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1cb80 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cbb0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
1cbc0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
1cbd0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
1cbe0 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
1cbf0 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
1cc00 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1cc10 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
1cc20 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
1cc30 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
1cc40 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1cc50 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1cc60 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
1cc70 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1cc80 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
1cc90 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
1cca0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
1ccb0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
1ccc0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
1ccd0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
1cce0 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
1ccf0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
1cd00 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
1cd10 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
1cd20 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1cd30 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
1cd40 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
1cd50 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
1cd60 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
1cd70 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
1cd80 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
1cd90 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1cda0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1cdb0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
1cdc0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1cdd0 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
1cde0 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
1cdf0 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
1ce00 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
1ce10 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
1ce20 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
1ce30 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
1ce40 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1ce50 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1ce60 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1ce70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
1ce80 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
1ce90 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
1cea0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
1ceb0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
1cec0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
1ced0 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
1cee0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
1cef0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1cf00 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
1cf10 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
1cf20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
1cf30 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
1cf40 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1cf50 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1cf60 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
1cf70 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1cf80 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
1cf90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1cfa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
1cfb0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
1cfc0 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
1cfd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cfe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1cff0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
1d000 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
1d010 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1d020 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1d030 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1d040 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
1d050 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
1d060 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
1d070 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1d080 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1d090 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1d0a0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
1d0b0 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
1d0c0 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
1d0d0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
1d0e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
1d0f0 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
1d100 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
1d110 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1d120 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
1d130 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
1d140 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
1d150 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1d160 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1d170 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1d180 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1d190 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1d1a0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1d1b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1d1c0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1d1d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d1e0 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
1d1f0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1d200 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
1d210 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
1d220 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
1d230 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1d240 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d260 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
1d270 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1d280 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1d290 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1d2a0 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
1d2b0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1d2c0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
1d2d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1d2e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d2f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d300 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
1d310 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
1d320 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d340 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
1d350 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
1d360 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
1d370 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
1d380 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
1d390 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
1d3a0 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
1d3b0 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
1d3c0 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
1d3d0 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
1d3e0 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
1d3f0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1d400 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1d410 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1d420 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1d430 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1d440 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
1d450 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
1d460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1d470 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1d480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d490 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d4a0 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
1d4b0 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
1d4c0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
1d4d0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
1d4e0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
1d4f0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
1d500 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
1d510 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
1d520 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1d540 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1d550 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1d560 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
1d570 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1d580 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d5a0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
1d5b0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1d5c0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
1d5d0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
1d5e0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
1d5f0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1d600 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1d610 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1d620 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1d630 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64  LOCK pid=%lu, id
1d640 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d  =%d, sharedMask=
1d650 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25  %03x, exclMask=%
1d660 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  03x, rc=%s\n",. 
1d670 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d680 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d690 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61  ), p->id, p->sha
1d6a0 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
1d6b0 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Mask,.          
1d6c0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1d6d0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
1d6e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1d6f0 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
1d700 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
1d710 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
1d720 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  d memory..**.** 
1d730 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
1d740 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
1d750 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
1d760 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
1d770 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
1d780 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
1d790 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
1d7a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d7b0 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20  winShmBarrier(. 
1d7c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1d7d0 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  d          /* Da
1d7e0 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
1d7f0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1d800 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
1d810 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
1d820 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65   /* MemoryBarrie
1d830 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74  r(); // does not
1d840 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20   work -- do not 
1d850 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a  know why not */.
1d860 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1d870 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  ex();.  winShmLe
1d880 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
1d890 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d8a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1d8b0 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
1d8c0 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
1d8d0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61  on of the.** sha
1d8e0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
1d8f0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
1d900 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
1d910 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
1d920 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75  egions.** are nu
1d930 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
1d940 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
1d950 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d960 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
1d970 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1d980 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
1d990 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
1d9a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1d9b0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
1d9c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1d9d0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1d9e0 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70  if the isWrite p
1d9f0 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e  arameter is 0 an
1da00 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1da10 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a  shared-memory.**
1da20 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1da30 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1da40 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69  by any client, i
1da50 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e  ncluding one run
1da60 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70  ning in a.** sep
1da70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20  arate process), 
1da80 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20  then *pp is set 
1da90 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49  to NULL and SQLI
1daa0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1dab0 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  If.** isWrite is
1dac0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
1dad0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
1dae0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1daf0 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20   has not yet.** 
1db00 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1db10 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1db20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1db30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1db40 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1db50 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1db60 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1db70 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1db80 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1db90 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1dba0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1dbb0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1dbc0 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64 72  rocesses.** addr
1dbd0 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
1dbe0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
1dbf0 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
1dc00 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
1dc10 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ped.** memory an
1dc20 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1dc30 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1dc40 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20  int winShmMap(. 
1dc50 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1dc60 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1dc70 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
1dc80 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
1dc90 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
1dca0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1dcb0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
1dcc0 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
1dcd0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
1dd00 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  ons */.  int isW
1dd10 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
1dd20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1dd30 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
1dd40 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1dd50 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
1dd60 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
1dd70 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
1dd80 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
1dd90 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
1dda0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
1ddb0 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20   winShm *pShm = 
1ddc0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
1ddd0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1dde0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
1ddf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1de00 28 20 21 70 53 68 6d 20 29 7b 0a 20 20 20 20 72  ( !pShm ){.    r
1de10 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
1de20 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
1de30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1de40 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1de50 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20 70 44  c;.    pShm = pD
1de60 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
1de70 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d   pShmNode = pShm
1de80 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
1de90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1dea0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1deb0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1dec0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1ded0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1dee0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1def0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
1df00 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
1df10 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
1df20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
1df30 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
1df40 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
1df50 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
1df60 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
1df70 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
1df80 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
1df90 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1dfa0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
1dfb0 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1dfd0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
1dfe0 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
1dff0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1e000 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
1e010 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
1e020 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1e030 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
1e040 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1e050 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1e060 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
1e070 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
1e080 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1e090 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
1e0a0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
1e0b0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
1e0c0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
1e0d0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1e0e0 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
1e0f0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
1e100 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1e110 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1e120 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
1e130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1e150 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1e160 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1e170 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1e180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e190 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1e1a0 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap1", pDbFd->zPa
1e1b0 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  th);.      goto 
1e1c0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1e1d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e   }..    if( sz<n
1e1e0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Byte ){.      /*
1e1f0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
1e200 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
1e210 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
1e220 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74  isWrite is set t
1e230 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c  o.      ** zero,
1e240 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
1e250 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1e260 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1e270 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
1e280 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
1e290 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
1e2a0 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
1e2b0 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63  zero, use ftrunc
1e2c0 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
1e2d0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
1e2e0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1e2f0 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  region..      */
1e300 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72  .      if( !isWr
1e310 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  ite ) goto shmpa
1e320 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63  ge_out;.      rc
1e330 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1e340 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1e350 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1e360 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
1e370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e380 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e390 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1e3a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
1e3b0 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
1e3c0 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1e3e0 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
1e3f0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1e400 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1e410 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1e420 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
1e430 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1e440 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
1e450 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1e460 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
1e470 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
1e480 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1e490 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1e4a0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
1e4b0 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
1e4c0 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
1e4d0 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
1e4e0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
1e4f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1e500 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e510 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1e520 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1e530 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1e540 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
1e550 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
1e560 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1e570 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
1e580 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c  ANDLE hMap = NUL
1e590 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  L;         /* fi
1e5a0 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
1e5b0 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
1e5c0 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
1e5d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
1e5e0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
1e5f0 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  /..#if SQLITE_OS
1e600 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61  _WINRT.      hMa
1e610 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1e620 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70  MappingFromApp(p
1e630 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1e640 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1e650 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1e660 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1e670 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
1e680 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1e690 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20  2_HAS_WIDE).    
1e6a0 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1e6b0 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53  eFileMappingW(pS
1e6c0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
1e6d0 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
1e6e0 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
1e6f0 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
1e700 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
1e710 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1e720 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
1e730 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1e740 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
1e750 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1e760 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1e770 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1e780 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
1e790 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69  L.      );.#endi
1e7a0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
1e7b0 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45  ("SHM-MAP-CREATE
1e7c0 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1e7d0 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1e7e0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1e7f0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1e800 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e810 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e820 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  n, nByte,.      
1e830 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20           hMap ? 
1e840 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1e850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
1e860 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
1e870 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e   iOffset = pShmN
1e880 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
1e890 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  egion;.        i
1e8a0 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1e8b0 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1e8c0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1e8d0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1e8e0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1e8f0 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70  NRT.        pMap
1e900 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1e910 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20  leFromApp(hMap, 
1e920 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
1e930 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
1e940 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
1e950 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
1e960 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
1e970 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
1e980 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
1e990 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61       pMap = osMa
1e9a0 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70  pViewOfFile(hMap
1e9b0 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
1e9c0 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
1e9d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
1e9e0 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1e9f0 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1ea00 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1ea10 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  .        );.#end
1ea20 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  if.        OSTRA
1ea30 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50  CE(("SHM-MAP-MAP
1ea40 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1ea50 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20  =%d, offset=%d, 
1ea60 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  size=%d, rc=%s\n
1ea70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ea80 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1ea90 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
1eaa0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
1eab0 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  iOffset,.       
1eac0 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69            szRegi
1ead0 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20  on, pMap ? "ok" 
1eae0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1eaf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1eb00 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  !pMap ){.       
1eb10 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
1eb20 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1eb30 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
1eb40 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1eb50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1eb60 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d  HMMAP, pShmNode-
1eb70 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
1eba0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1ebb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
1ebc0 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
1ebd0 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
1ebe0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1ebf0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
1ec00 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1ec10 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
1ec20 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
1ec30 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
1ec40 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
1ec50 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
1ec60 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
1ec70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
1ec80 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
1ec90 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
1eca0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1ecb0 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
1ecc0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
1ecd0 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
1ece0 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
1ecf0 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
1ed00 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
1ed10 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1ed20 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
1ed30 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
1ed40 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
1ed50 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
1ed60 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
1ed70 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
1ed80 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
1ed90 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
1eda0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1edb0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1edc0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1edd0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
1ede0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
1edf0 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
1ee00 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
1ee10 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1ee20 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
1ee30 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
1ee40 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
1ee50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ee60 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
1ee70 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70  leans up the map
1ee80 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68  ped region of th
1ee90 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1eea0 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66  , if any..*/.#if
1eeb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1eec0 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
1eed0 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  nt winUnmapfile(
1eee0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
1eef0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1ef00 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
1ef10 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1ef20 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1ef30 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65   hMap=%p, pMapRe
1ef40 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1ef50 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d        "mmapSize=
1ef60 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63  %lld, mmapSizeAc
1ef70 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  tual=%lld, mmapS
1ef80 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a  izeMax=%lld\n",.
1ef90 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1efa0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1efb0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
1efc0 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70  ->hMap, pFile->p
1efd0 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20  MapRegion,.     
1efe0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1eff0 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d  pSize, pFile->mm
1f000 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46  apSizeActual, pF
1f010 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1f020 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ));.  if( pFile-
1f030 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
1f040 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56     if( !osUnmapV
1f050 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
1f060 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a  >pMapRegion) ){.
1f070 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1f080 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1f090 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1f0a0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1f0b0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1f0c0 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
1f0d0 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1f0e0 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
1f0f0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
1f100 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
1f110 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1f120 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1f130 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
1f140 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
1f150 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1f160 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1f170 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1f180 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1f1a0 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70  inUnmapfile1", p
1f1b0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1f1c0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70    }.    pFile->p
1f1d0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
1f1e0 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1f1f0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ze = 0;.    pFil
1f200 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1f210 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  l = 0;.  }.  if(
1f220 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55   pFile->hMap!=NU
1f230 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  LL ){.    if( !o
1f240 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
1f250 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20  le->hMap) ){.   
1f260 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1f270 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1f280 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
1f290 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1f2a0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1f2b0 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72  e=%p, hMap=%p, r
1f2c0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1f2d0 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  MAP\n",.        
1f2e0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1f2f0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1f300 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d  pFile, pFile->hM
1f310 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ap));.      retu
1f320 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
1f330 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1f340 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
1f350 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1f370 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46  nUnmapfile2", pF
1f380 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
1f390 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d   }.    pFile->hM
1f3a0 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  ap = NULL;.  }. 
1f3b0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1f3c0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1f3d0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1f3e0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1f3f0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f400 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1f410 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
1f420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f430 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
1f440 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
1f450 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
1f460 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
1f470 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
1f480 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
1f490 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
1f4a0 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
1f4b0 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
1f4c0 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65 20  Or, if.** there 
1f4d0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
1f4e0 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
1f4f0 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
1f500 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f  e are still.** o
1f510 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
1f520 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
1f530 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
1f540 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1f550 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1f560 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
1f570 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
1f580 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
1f590 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  ed size of.** th
1f5a0 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
1f5b0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
1f5c0 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
1f5d0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1f5e0 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 65   the.** requeste
1f5f0 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69  d size is the si
1f600 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
1f610 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75  n disk. The actu
1f620 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  al size of the.*
1f630 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e  * created mappin
1f640 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  g is either the 
1f650 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
1f660 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66  r the value conf
1f670 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20  igured.** using 
1f680 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
1f690 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76 65  P_SIZE, whicheve
1f6a0 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a  r is smaller..**
1f6b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1f6c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
1f6d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76  error occurs (ev
1f6e0 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e  en if the mappin
1f6f0 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72  g is not.** recr
1f700 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  eated as a resul
1f710 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  t of outstanding
1f720 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20   references) or 
1f730 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
1f740 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
1f750 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f760 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46   winMapfile(winF
1f770 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65  ile *pFd, sqlite
1f780 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
1f790 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1f7a0 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20  nMap = nByte;.  
1f7b0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1f7c0 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
1f7d0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
1f7e0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d  );.  OSTRACE(("M
1f7f0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1f800 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d   pFile=%p, size=
1f810 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %lld\n",.       
1f820 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f830 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1f840 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69 66  , nByte));..  if
1f850 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
1f860 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
1f870 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d  TE_OK;..  if( nM
1f880 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ap<0 ){.    rc =
1f890 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71   winFileSize((sq
1f8a0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c  lite3_file*)pFd,
1f8b0 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66 28   &nMap);.    if(
1f8c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53 54   rc ){.      OST
1f8d0 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
1f8e0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f8f0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
1f900 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20  RR_FSTAT\n",.   
1f910 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1f920 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1f930 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20  d(), pFd));.    
1f940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f950 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
1f960 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61   }.  }.  if( nMa
1f970 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  p>pFd->mmapSizeM
1f980 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d  ax ){.    nMap =
1f990 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
1f9a0 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d  x;.  }.  nMap &=
1f9b0 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ~(sqlite3_int64
1f9c0 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  )(winSysInfo.dwP
1f9d0 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20  ageSize - 1);.. 
1f9e0 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20   if( nMap==0 && 
1f9f0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20  pFd->mmapSize>0 
1fa00 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  ){.    winUnmapf
1fa10 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20  ile(pFd);.  }.  
1fa20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
1fa30 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76  mapSize ){.    v
1fa40 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  oid *pNew = 0;. 
1fa50 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74     DWORD protect
1fa60 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59   = PAGE_READONLY
1fa70 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67  ;.    DWORD flag
1fa80 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  s = FILE_MAP_REA
1fa90 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70  D;..    winUnmap
1faa0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69  file(pFd);.    i
1fab0 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61  f( (pFd->ctrlFla
1fac0 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f  gs & WINFILE_RDO
1fad0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
1fae0 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
1faf0 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20  READWRITE;.     
1fb00 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d   flags |= FILE_M
1fb10 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a  AP_WRITE;.    }.
1fb20 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1fb30 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  NRT.    pFd->hMa
1fb40 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1fb50 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70  MappingFromApp(p
1fb60 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
1fb70 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c  tect, nMap, NULL
1fb80 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1fb90 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1fba0 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d  S_WIDE).    pFd-
1fbb0 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
1fbc0 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64  FileMappingW(pFd
1fbd0 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1fbe0 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61      (DWORD)((nMa
1fc10 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66  p>>32) & 0xfffff
1fc20 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20  fff),.          
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d        (DWORD)(nM
1fc50 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29  ap & 0xffffffff)
1fc60 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64  , NULL);.#elif d
1fc70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1fc80 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
1fc90 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
1fca0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1fcb0 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c  gA(pFd->h, NULL,
1fcc0 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20   protect,.      
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1fcf0 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30  )((nMap>>32) & 0
1fd00 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20  xffffffff),.    
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
1fd30 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66  RD)(nMap & 0xfff
1fd40 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23  fffff), NULL);.#
1fd50 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
1fd60 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b  d->hMap==NULL ){
1fd70 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74  .      pFd->last
1fd80 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1fd90 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1fda0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1fdb0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1fdc0 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72  AP, pFd->lastErr
1fdd0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1fde0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d             "winM
1fdf0 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a  apfile1", pFd->z
1fe00 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Path);.      /* 
1fe10 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62  Log the error, b
1fe20 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d  ut continue norm
1fe30 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69  al operation usi
1fe40 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20  ng xRead/xWrite 
1fe50 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  */.      OSTRACE
1fe60 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41  (("MAP-FILE-CREA
1fe70 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
1fe80 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%p, rc=%s\n",.
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1fea0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1feb0 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c  ssId(), pFd, sql
1fec0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1fed0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1fee0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1fef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d  .    assert( (nM
1ff00 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ap % winSysInfo.
1ff10 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  dwPageSize)==0 )
1ff20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
1ff30 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69  zeof(SIZE_T)==si
1ff40 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74  zeof(sqlite3_int
1ff50 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66  64) || nMap<=0xf
1ff60 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53  fffffff );.#if S
1ff70 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1ff80 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56     pNew = osMapV
1ff90 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
1ffa0 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67  (pFd->hMap, flag
1ffb0 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d  s, 0, (SIZE_T)nM
1ffc0 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  ap);.#else.    p
1ffd0 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
1ffe0 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c  fFile(pFd->hMap,
1fff0 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53   flags, 0, 0, (S
20000 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e  IZE_T)nMap);.#en
20010 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77  dif.    if( pNew
20020 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
20030 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
20040 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  d->hMap);.      
20050 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  pFd->hMap = NULL
20060 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  ;.      pFd->las
20070 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
20080 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
20090 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
200a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
200b0 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72  MAP, pFd->lastEr
200c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
200d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
200e0 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e  Mapfile2", pFd->
200f0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a  zPath);.      /*
20100 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20   Log the error, 
20110 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72  but continue nor
20120 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73  mal operation us
20130 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
20140 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
20150 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50  E(("MAP-FILE-MAP
20160 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
20170 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
20190 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
201a0 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
201b0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
201c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
201d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
201e0 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69     pFd->pMapRegi
201f0 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  on = pNew;.    p
20200 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  Fd->mmapSize = n
20210 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  Map;.    pFd->mm
20220 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e  apSizeActual = n
20230 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  Map;.  }..  OSTR
20240 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
20250 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
20260 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
20270 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
20280 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20290 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20  sId(), pFd));.  
202a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
202b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
202c0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
202d0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
202e0 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
202f0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20300 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
20310 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
20320 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
20330 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
20340 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
20350 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
20360 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
20370 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
20380 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
20390 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
203a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
203b0 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
203c0 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
203d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
203e0 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
203f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
20400 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
20410 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
20420 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
20430 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
20440 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
20450 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
20460 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
20470 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
20480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
20490 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
204a0 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
204b0 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a  ust eventually.*
204c0 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65  * release the re
204d0 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69  ference by calli
204e0 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e  ng winUnfetch().
204f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20500 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  inFetch(sqlite3_
20510 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
20520 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
20530 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51  id **pp){.#if SQ
20540 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
20550 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
20560 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
20570 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
20580 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
20590 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
205a0 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53    *pp = 0;..  OS
205b0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
205c0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
205d0 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d   offset=%lld, am
205e0 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e  ount=%d, pp=%p\n
205f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
20600 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20610 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c  sId(), fd, iOff,
20620 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69   nAmt, pp));..#i
20630 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
20640 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
20650 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  Fd->mmapSizeMax>
20660 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64  0 ){.    if( pFd
20670 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20  ->pMapRegion==0 
20680 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
20690 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64  = winMapfile(pFd
206a0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
206b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
206c0 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  {.        OSTRAC
206d0 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
206e0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
206f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
20700 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20710 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20720 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
20730 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
20740 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20760 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
20770 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20  ze >= iOff+nAmt 
20780 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26  ){.      *pp = &
20790 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
207a0 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20  Region)[iOff];. 
207b0 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68       pFd->nFetch
207c0 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out++;.    }.  }
207d0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
207e0 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
207f0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70  lu, pFile=%p, pp
20800 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d  =%p, *pp=%p, rc=
20810 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
20820 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20830 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20840 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b  , fd, pp, *pp));
20850 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20860 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
20870 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
20880 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ent is non-NULL,
20890 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
208a0 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a  ion releases a.*
208b0 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  * reference obta
208c0 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ined by an earli
208d0 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65  er call to winFe
208e0 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e  tch(). The secon
208f0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61  d.** argument pa
20900 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
20910 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68  ction must be th
20920 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f  e same as the co
20930 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61  rresponding.** a
20940 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73  rgument that was
20950 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77   passed to the w
20960 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61  inFetch() invoca
20970 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  tion..**.** Or, 
20980 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
20990 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
209a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
209b0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
209c0 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74  d.** to inform t
209d0 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
209e0 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
209f0 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
20a00 69 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d  ing mapping.** m
20a10 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
20a20 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
20a30 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
20a40 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74  tic int winUnfet
20a50 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
20a60 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76  *fd, i64 iOff, v
20a70 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  oid *p){.#if SQL
20a80 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
20a90 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
20aa0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
20ab0 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
20ac0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
20ad0 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  file */..  /* If
20ae0 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
20af0 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
20b00 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
20b10 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a   no outstanding.
20b20 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
20b30 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
20b40 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
20b50 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
20b60 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
20b70 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
20b80 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
20b90 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
20ba0 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
20bb0 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
20bc0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
20bd0 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
20be0 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
20bf0 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
20c00 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
20c10 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
20c20 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
20c30 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
20c40 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
20c50 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
20c60 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  ld, p=%p\n",.   
20c70 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20c80 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20c90 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b   pFd, iOff, p));
20ca0 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
20cb0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
20cc0 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
20cd0 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69  /* FIXME:  If Wi
20ce0 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61  ndows truly alwa
20cf0 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e  ys prevents trun
20d00 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69  cating or deleti
20d10 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ng a.    ** file
20d20 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67   while a mapping
20d30 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74   is held, then t
20d40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e  he following win
20d50 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c  Unmapfile() call
20d60 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63  .    ** is unnec
20d70 65 73 73 61 72 79 20 63 61 6e 20 62 65 20 6f 6d  essary can be om
20d80 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61  itted - potentia
20d90 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20  lly improving.  
20da0 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65    ** performance
20db0 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d  .  */.    winUnm
20dc0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
20dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
20de0 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
20df0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
20e00 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64  CE(("UNFETCH pid
20e10 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20e20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
20e30 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20e40 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20e50 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74  d(), fd));.  ret
20e60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20e70 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
20e80 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
20e90 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
20ea0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
20eb0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
20ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
20ed0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
20ee0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
20ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f00 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
20f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f50 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
20f60 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
20f70 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
20f80 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
20f90 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
20fa0 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
20fb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
20fc0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
20fd0 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
20fe0 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
21010 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
21020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21030 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
21040 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
21070 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21090 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
210a0 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
210d0 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210f0 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
21100 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
21130 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
21140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21150 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
21160 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
21190 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
211a0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
211b0 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
211c0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
211d0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
211f0 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
21200 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
21210 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
21220 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
21230 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
21240 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21250 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
21260 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21270 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
21280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21290 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
212a0 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
212b0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
212c0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
212d0 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
212e0 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
212f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
21300 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
21310 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
21320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21330 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69  ShmUnmap */.  wi
21340 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nFetch,         
21350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21360 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e   xFetch */.  win
21370 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20  Unfetch         
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21390 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a  xUnfetch */.};..
213a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
213b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
213f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
21410 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
21420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
21440 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
21450 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
21460 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
21470 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
21480 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
21490 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ect..*/..#if def
214a0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
214b0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
214c0 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77   filename from w
214d0 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65  hatever the unde
214e0 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
214f0 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f   system.** suppo
21500 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65  rts for filename
21510 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53  s into UTF-8.  S
21520 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
21530 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62   result is.** ob
21540 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
21550 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
21560 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
21570 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
21580 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
21590 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
215a0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69  lename(const voi
215b0 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  d *zFilename){. 
215c0 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65   char *zConverte
215d0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
215e0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
215f0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69  nverted = winUni
21600 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65  codeToUtf8(zFile
21610 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
21620 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
21630 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
21640 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
21650 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
21660 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c  bcs_to_utf8(zFil
21670 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
21680 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
21690 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
216a0 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
216b0 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
216c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
216d0 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
216e0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
216f0 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
21700 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
21710 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
21720 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
21730 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
21740 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
21750 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
21760 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
21770 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
21780 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
21790 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
217a0 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72   void *winConver
217b0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
217c0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
217d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
217e0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
217f0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
21800 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
21810 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  ed = winUtf8ToUn
21820 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
21830 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
21840 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
21850 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
21860 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
21870 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
21880 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
21890 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
218a0 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
218b0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
218c0 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
218d0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
218e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
218f0 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
21900 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
21910 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  fied UTF-8 strin
21920 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73  g buffer.** ends
21930 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72   with a director
21940 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
21950 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73  acter or one was
21960 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a   successfully.**
21970 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f   added to it..*/
21980 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
21990 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69  akeEndInDirSep(i
219a0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
219b0 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
219c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
219d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
219e0 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66  30(zBuf);.    if
219f0 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nLen>0 ){.    
21a00 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65    if( winIsDirSe
21a10 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20  p(zBuf[nLen-1]) 
21a20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21a30 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
21a40 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66   if( nLen+1<nBuf
21a50 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66   ){.        zBuf
21a60 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44  [nLen] = winGetD
21a70 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20  irSep();.       
21a80 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20   zBuf[nLen+1] = 
21a90 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65  '\0';.        re
21aa0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
21ab0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21ac0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
21ad0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
21ae0 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  y file name and 
21af0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
21b00 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ing pointer into
21b10 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70   pzBuf..** The p
21b20 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
21b30 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65  in pzBuf must be
21b40 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74   freed via sqlit
21b50 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
21b60 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
21b70 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
21b80 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20  vfs *pVfs, char 
21b90 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  **pzBuf){.  stat
21ba0 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
21bb0 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
21bc0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
21bd0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
21be0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
21bf0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
21c00 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
21c10 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65  i, j;.  int nPre
21c20 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
21c30 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
21c40 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69  ILE_PREFIX);.  i
21c50 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e  nt nMax, nBuf, n
21c60 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61  Dir, nLen;.  cha
21c70 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49  r *zBuf;..  /* I
21c80 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
21c90 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
21ca0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
21cb0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
21cc0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
21cd0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
21ce0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
21cf0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
21d00 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
21d10 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a  ion failing..  *
21d20 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
21d30 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
21d40 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f  TE_IOERR );..  /
21d50 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
21d60 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
21d70 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79   store the fully
21d80 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a   qualified file.
21d90 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68    ** name for th
21da0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
21db0 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  .  If this fails
21dc0 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74  , we cannot cont
21dd0 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61  inue..  */.  nMa
21de0 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  x = pVfs->mxPath
21df0 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61  name; nBuf = nMa
21e00 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20  x + 2;.  zBuf = 
21e10 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
21e20 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28  o( nBuf );.  if(
21e30 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53   !zBuf ){.    OS
21e40 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
21e50 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
21e60 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
21e70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21e80 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
21e90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
21ea0 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
21eb0 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ive temporary di
21ec0 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c  rectory.  First,
21ed0 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20   check if one.  
21ee0 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  ** has been expl
21ef0 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68  icitly set by th
21f00 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f  e application; o
21f10 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
21f20 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  e one.  ** confi
21f30 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65  gured by the ope
21f40 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20  rating system.. 
21f50 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61   */.  nDir = nMa
21f60 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b  x - (nPre + 15);
21f70 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e  .  assert( nDir>
21f80 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
21f90 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
21fa0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69  y ){.    int nDi
21fb0 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  rLen = sqlite3St
21fc0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74  rlen30(sqlite3_t
21fd0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
21fe0 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
21ff0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
22000 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69  winIsDirSep(sqli
22010 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
22020 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29  ry[nDirLen-1]) )
22030 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65  {.        nDirLe
22040 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
22050 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e     if( nDirLen>n
22060 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Dir ){.        s
22070 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22080 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
22090 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
220a0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
220b0 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  OR\n"));.       
220c0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
220d0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
220e0 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
220f0 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
22100 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
22110 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
22120 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c   zBuf, "%s", sql
22130 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
22140 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ory);.    }.  }.
22150 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
22160 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a  GWIN__).  else{.
22170 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
22180 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
22190 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a  = {.       0, /*
221a0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
221b0 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20  TMPDIR") */.    
221c0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
221d0 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  "TMPDIR") */.   
221e0 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
221f0 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  ("TMP") */.     
22200 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
22210 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20  TEMP") */.      
22220 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55   0, /* getenv("U
22230 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a  SERPROFILE") */.
22240 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70         "/var/tmp
22250 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f  ",.       "/usr/
22260 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74  tmp",.       "/t
22270 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c  mp",.       ".",
22280 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20  .       0       
22290 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
222a0 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  tor */.    };.  
222b0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
222c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
222d0 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20   *zDir = 0;..   
222e0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
222f0 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
22300 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
22310 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
22320 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
22330 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
22340 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
22350 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
22360 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
22370 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66  v("TMP");.    if
22380 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61  ( !azDirs[3] ) a
22390 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e  zDirs[3] = geten
223a0 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69  v("TEMP");.    i
223b0 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20  f( !azDirs[4] ) 
223c0 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65  azDirs[4] = gete
223d0 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
223e0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
223f0 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
22400 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
22410 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
22420 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69  i++]){.      voi
22430 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
22440 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30       if( zDir==0
22450 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22460 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74     /* If the pat
22470 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  h starts with a 
22480 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c  drive letter fol
22490 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c  lowed by the col
224a0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72  on.      ** char
224b0 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74  acter, assume it
224c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61   is already a na
224d0 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b  tive Win32 path;
224e0 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   otherwise,.    
224f0 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20    ** it must be 
22500 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e  converted to a n
22510 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
22520 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e 20   via the Cygwin 
22530 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69  API.      ** pri
22540 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a  or to using it..
22550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
22560 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  f( winIsDriveLet
22570 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72  terAndColon(zDir
22580 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ) ){.        zCo
22590 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
225a0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
225b0 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20  name(zDir);.    
225c0 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
225d0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
225e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
225f0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
22600 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22610 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22620 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
22640 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22650 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
22660 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  }.        if( wi
22670 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
22680 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
22690 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
226a0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
226b0 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
226c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
226d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
226e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
226f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22700 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22710 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22730 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
22740 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
22750 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20  nMax+1 );.      
22760 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65    if( !zConverte
22770 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
22780 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
227a0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
227b0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
227c0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
227d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
227e0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
227f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
22800 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67 77          if( cygw
22810 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20  in_conv_path(.  
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
22830 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
22840 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
22850 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
22860 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20  , zDir,.        
22870 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
22880 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b  ed, nMax+1)<0 ){
22890 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
228a0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
228b0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ed);.          s
228c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
228d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
228e0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
228f0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
22900 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22  OERR_CONVPATH\n"
22910 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
22920 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
22930 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  (SQLITE_IOERR_CO
22940 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
22950 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
22980 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20  me2", zDir);.   
22990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
229a0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
229b0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
229c0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
229d0 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
229e0 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72  he candidate dir
229f0 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e  ectory exists an
22a00 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20  d should.       
22a10 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20     ** be used.  
22a20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20  However, we may 
22a30 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  need to convert 
22a40 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  the string conta
22a50 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  ining.          
22a60 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f  ** its name into
22a70 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20   UTF-8 (i.e. if 
22a80 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67  it is UTF-16 rig
22a90 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20  ht now)..       
22aa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22ab0 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
22ac0 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
22ad0 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65  lename(zConverte
22ae0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
22af0 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
22b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22b10 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
22b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
22b30 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22b40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53  ;.            OS
22b50 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22b60 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22b70 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
22b80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
22b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22ba0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
22bb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
22bc0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
22bd0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
22be0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
22bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22c00 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20  (zUtf8);.       
22c10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22c20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22c30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22c60 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69  }.    }.  }.#eli
22c80 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
22c90 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
22ca0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73  _CYGWIN__).  els
22cb0 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29  e if( osIsNT() )
22cc0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
22cd0 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a  ti;.    LPWSTR z
22ce0 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69 74  WidePath = sqlit
22cf0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
22d00 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ax*sizeof(WCHAR)
22d10 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57 69   );.    if( !zWi
22d20 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  dePath ){.      
22d30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22d40 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
22d50 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22d60 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22d70 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
22d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22d90 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
22da0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47     }.    if( osG
22db0 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61 78  etTempPathW(nMax
22dc0 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30 20  , zWidePath)==0 
22dd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22de0 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29  _free(zWidePath)
22df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22e00 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22e10 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22e20 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22e30 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
22e40 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  PPATH\n"));.    
22e50 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
22e60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22e70 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f  R_GETTEMPPATH, o
22e80 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
22e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ea0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
22eb0 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b  tTempname2", 0);
22ec0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74  .    }.    zMult
22ed0 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  i = winUnicodeTo
22ee0 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b  Utf8(zWidePath);
22ef0 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20  .    if( zMulti 
22f00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22f10 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
22f20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  zBuf, "%s", zMul
22f30 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
22f40 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
22f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22f60 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
22f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22f80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
22f90 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20  idePath);.      
22fa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22fb0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
22fc0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22fd0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22fe0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
22ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23000 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
23010 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
23020 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
23030 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
23040 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
23050 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61     char *zMbcsPa
23060 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  th = sqlite3Mall
23070 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a  ocZero( nMax );.
23080 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61      if( !zMbcsPa
23090 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
230a0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
230b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
230c0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
230d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
230e0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
230f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23100 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
23110 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65  .    if( osGetTe
23120 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d  mpPathA(nMax, zM
23130 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20  bcsPath)==0 ){. 
23140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23150 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
23160 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
23170 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
23180 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
23190 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
231a0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
231b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
231c0 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
231d0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231f0 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
23200 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20  mpname3", 0);.  
23210 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20    }.    zUtf8 = 
23220 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
23230 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73  cs_to_utf8(zMbcs
23240 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
23250 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71  Utf8 ){.      sq
23260 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
23270 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
23280 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73   zUtf8);.      s
23290 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
232a0 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
232b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
232c0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
232d0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
232e0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
232f0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
23300 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23310 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23320 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  EM;.    }.  }.#e
23330 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
23340 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f  IN32_HAS_ANSI */
23350 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
23360 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
23370 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
23380 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
23390 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
233a0 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20 61  tory ends with a
233b0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
233c0 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49  ** separator.  I
233d0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e  f it does not an
233e0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  d there is not e
233f0 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
23400 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65   to add.  ** one
23410 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69  , fail..  */.  i
23420 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  f( !winMakeEndIn
23430 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a  DirSep(nDir+1, z
23440 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Buf) ){.    sqli
23450 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23460 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
23470 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
23480 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
23490 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
234a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
234b0 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
234c0 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b  tTempname4", 0);
234d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
234e0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
234f0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
23500 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
23510 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
23520 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e  ile.  ** name in
23530 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
23540 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ormat:.  **.  **
23550 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64     "<temporary_d
23560 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73  irectory>/etilqs
23570 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  _XXXXXXXXXXXXXXX
23580 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  \0\0".  **.  ** 
23590 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  If not, return S
235a0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68  QLITE_ERROR.  Th
235b0 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75  e number 17 is u
235c0 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65  sed here in orde
235d0 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e  r to.  ** accoun
235e0 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65 20  t for the space 
235f0 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20 63  used by the 15 c
23600 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20  haracter random 
23610 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20  suffix and the. 
23620 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67   ** two trailing
23630 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e   NUL characters.
23640 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65    The final dire
23650 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
23660 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68  character.  ** h
23670 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65 64  as already added
23680 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
23690 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a  lready present..
236a0 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71    */.  nLen = sq
236b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
236c0 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e  uf);.  if( (nLen
236d0 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20   + nPre + 17) > 
236e0 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  nBuf ){.    sqli
236f0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23700 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
23710 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
23720 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
23730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
23740 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
23750 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
23760 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b  tTempname5", 0);
23770 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
23780 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36  snprintf(nBuf-16
23790 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e  -nLen, zBuf+nLen
237a0 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  , SQLITE_TEMP_FI
237b0 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a  LE_PREFIX);..  j
237c0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
237d0 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  30(zBuf);.  sqli
237e0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
237f0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
23800 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
23810 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42  ++, j++){.    zB
23820 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
23830 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
23840 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
23850 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
23860 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ) ];.  }.  zBuf[
23870 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a  j] = 0;.  zBuf[j
23880 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75  +1] = 0;.  *pzBu
23890 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54  f = zBuf;..  OST
238a0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
238b0 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  NAME name=%s, rc
238c0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a  =SQLITE_OK\n", z
238d0 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
238e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
238f0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
23900 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
23910 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69  e is really a di
23920 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e  rectory.  Return
23930 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20   false if.** it 
23940 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
23950 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74  er than a direct
23960 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ory, or if there
23970 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
23980 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
23990 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  tion failure..*/
239a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
239b0 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
239c0 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20  *zConverted){.  
239d0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
239e0 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
239f0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
23a00 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
23a10 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
23a20 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
23a30 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
23a40 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
23a50 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
23a60 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
23a70 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
23a80 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
23a90 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
23aa0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
23ab0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
23ae0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
23b10 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
23b20 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
23b30 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
23b40 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
23b50 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76  return 0; /* Inv
23b60 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20  alid name? */.  
23b70 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73    }.    attr = s
23b80 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
23b90 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53  ttributes;.#if S
23ba0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
23bb0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
23bc0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
23bd0 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
23be0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
23bf0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
23c00 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49  rn (attr!=INVALI
23c10 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
23c20 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45  S) && (attr&FILE
23c30 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
23c40 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TORY);.}../*.** 
23c50 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
23c60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
23c70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
23c80 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
23c90 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d  /* Used to get m
23ca0 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d 65  aximum path name
23cb0 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f 6e   length */.  con
23cc0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
23cd0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23ce0 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
23cf0 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
23d00 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
23d10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
23d20 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
23d30 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
23d40 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
23d50 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
23d60 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
23d70 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
23d80 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
23d90 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
23da0 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
23db0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
23dc0 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  no = 0;.  DWORD 
23dd0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
23de0 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
23df0 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
23e00 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
23e10 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
23e20 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
23e30 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  s = 0;.#if SQLIT
23e40 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
23e50 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e   isTemp = 0;.#en
23e60 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
23e70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
23e80 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
23e90 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20  nverted;        
23ea0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
23eb0 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
23ec0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
23ed0 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
23ee0 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ame; /* Filename
23ef0 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
23f00 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  ng */.  int cnt 
23f10 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  = 0;..  /* If ar
23f20 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
23f30 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
23f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23f50 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
23f60 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
23f70 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
23f80 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
23f90 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
23fa0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
23fb0 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f  *zTmpname = 0; /
23fc0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
23fd0 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63  filename, if nec
23fe0 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e  essary. */..  in
23ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24000 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24010 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
24020 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66  Code */.#if !def
24030 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
24040 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
24050 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
24060 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
24070 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
24080 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64   to open */.#end
24090 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  if..  int isExcl
240a0 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
240b0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
240c0 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
240d0 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
240e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
240f0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
24100 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
24110 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
24120 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
24130 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
24140 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
24150 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
24160 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
24170 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
24180 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24190 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
241a0 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
241b0 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
241c0 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
241d0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
241e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
241f0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
24200 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
24210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
24220 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c  _JOURNAL.     ||
24230 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24240 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65  PEN_WAL.  ));.#e
24250 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
24260 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
24270 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d  pFile=%p, flags=
24280 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  %x, pOutFlags=%p
24290 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
242a0 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66  zUtf8Name, id, f
242b0 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
242c0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
242d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
242e0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
242f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61  :.  **.  **   (a
24300 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
24310 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
24320 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
24330 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
24340 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  nd.  **   (b) if
24350 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
24360 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
24370 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
24380 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
24390 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
243a0 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
243b0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
243c0 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
243d0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
243e0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
243f0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
24400 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
24410 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
24420 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
24430 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
24440 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
24450 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
24460 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
24470 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
24480 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
24490 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
244a0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
244b0 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
244c0 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
244d0 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
244e0 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
244f0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
24500 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a  l are never.  **
24510 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
24520 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
24530 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
24540 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
24550 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
24560 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
24570 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
24580 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
24590 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
245a0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
245b0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
245c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
245d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
245e0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
245f0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
24600 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
24610 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
24620 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
24630 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
24640 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
24650 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
24660 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
24670 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
24680 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
24690 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
246a0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
246b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
246c0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
246d0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
246e0 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20 20 20  N_TEMP_DB.      
246f0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24700 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
24710 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
24720 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
24730 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c  OURNAL.       ||
24740 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24750 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
24760 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24770 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
24780 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20  URNAL.       || 
24790 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
247a0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
247b0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
247c0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
247d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
247e0 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  =0 );.  memset(p
247f0 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
24800 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69  winFile));.  pFi
24810 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  le->h = INVALID_
24820 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23  HANDLE_VALUE;..#
24830 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
24840 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  RT.  if( !zUtf8N
24850 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f  ame && !sqlite3_
24860 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
24870 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
24880 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a  g(SQLITE_ERROR,.
24890 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
248a0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
248b0 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
248c0 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54  be set for WinRT
248d0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
248e0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f    /* If the seco
248f0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
24900 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24910 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61  NULL, generate a
24920 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
24930 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
24940 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
24950 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
24960 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
24970 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
24980 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
24990 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
249a0 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  , &zTmpname);.  
249b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
249c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
249d0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
249e0 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
249f0 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
24a00 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
24a10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24a20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
24a30 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
24a40 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
24a50 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
24a60 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
24a70 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
24a80 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
24a90 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
24aa0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
24ab0 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
24ac0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
24ad0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
24ae0 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
24af0 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
24b00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
24b10 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
24b20 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
24b30 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e  ||.       zUtf8N
24b40 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
24b50 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  n30(zUtf8Name)+1
24b60 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
24b70 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
24b80 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
24b90 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
24ba0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
24bb0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
24bc0 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
24bd0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
24be0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rted==0 ){.    s
24bf0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
24c00 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
24c10 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
24c20 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
24c30 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38  RR_NOMEM", zUtf8
24c40 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
24c50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24c60 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
24c70 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
24c80 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
24c90 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
24ca0 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
24cb0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
24cc0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
24cd0 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
24ce0 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
24cf0 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38  EN_ISDIR", zUtf8
24d00 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
24d10 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
24d20 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
24d30 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
24d40 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
24d50 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
24d60 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
24d70 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
24d80 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
24d90 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
24da0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
24db0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
24dc0 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
24dd0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
24de0 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20 20 2a   new file is.  *
24df0 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74  * created. SQLit
24e00 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74  e doesn't use it
24e10 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78   to indicate "ex
24e20 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 0a  clusive access".
24e30 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73    ** as it is us
24e40 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64  ually understood
24e50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
24e60 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
24e70 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77  /* Creates a new
24e80 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
24e90 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
24ea0 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  dy exist. */.   
24eb0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
24ec0 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73  exists, it fails
24ed0 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
24ee0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
24ef0 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d   CREATE_NEW;.  }
24f00 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74  else if( isCreat
24f10 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
24f20 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20   existing file, 
24f30 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20  or create if it 
24f40 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f  doesn't exist */
24f50 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
24f60 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
24f70 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
24f80 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20  e{.    /* Opens 
24f90 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  a file, only if 
24fa0 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  it exists. */.  
24fb0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
24fc0 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45  osition = OPEN_E
24fd0 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20  XISTING;.  }..  
24fe0 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49  dwShareMode = FI
24ff0 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
25000 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
25010 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  ;..  if( isDelet
25020 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  e ){.#if SQLITE_
25030 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46  OS_WINCE.    dwF
25040 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
25050 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
25060 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69  TE_HIDDEN;.    i
25070 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65  sTemp = 1;.#else
25080 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
25090 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
250a0 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f  _ATTRIBUTE_TEMPO
250b0 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  RARY.           
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49      | FILE_ATTRI
250e0 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20  BUTE_HIDDEN.    
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
25110 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
25120 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20  _CLOSE;.#endif. 
25130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
25140 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
25150 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
25160 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
25170 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20  /* Reports from 
25180 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65  the internet are
25190 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63   that performanc
251a0 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a  e is always.  **
251b0 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f   better if FILE_
251c0 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
251d0 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63  SS is used.  Tic
251e0 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69  ket #2699. */.#i
251f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
25200 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74  E.  dwFlagsAndAt
25210 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45  tributes |= FILE
25220 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
25230 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ESS;.#endif..  i
25240 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
25250 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25260 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c  RT.    CREATEFIL
25270 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
25280 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50  METERS extendedP
25290 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65  arameters;.    e
252a0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
252b0 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f  s.dwSize = sizeo
252c0 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  f(CREATEFILE2_EX
252d0 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
252e0 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  S);.    extended
252f0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
25300 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20  eAttributes =.  
25310 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
25320 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
25330 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
25340 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
25350 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
25360 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61  ileFlags = dwFla
25370 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
25380 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  & FILE_FLAG_MASK
25390 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
253a0 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72  rameters.dwSecur
253b0 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45  ityQosFlags = SE
253c0 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53  CURITY_ANONYMOUS
253d0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
253e0 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72  rameters.lpSecur
253f0 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20  ityAttributes = 
25400 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64  NULL;.    extend
25410 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65  edParameters.hTe
25420 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c  mplateFile = NUL
25430 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  L;.    while( (h
25440 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32   = osCreateFile2
25450 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
25460 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
25490 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
254e0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
254f0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25510 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61     &extendedPara
25520 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49  meters))==INVALI
25530 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
25540 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25560 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
25570 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
25580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25590 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
255a0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69   }.#else.    whi
255b0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
255c0 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29  eFileW((LPCWSTR)
255d0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
25600 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25620 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
25630 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
25660 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
25670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
25690 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
256a0 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
256d0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
256e0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
25710 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
25720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25730 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
25740 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
25750 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
25760 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
25770 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
25780 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
25790 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65  A((LPCSTR)zConve
257a0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
257d0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
25800 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25820 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
25830 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25850 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
25860 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
25870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
25890 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
258a0 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
258d0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
258e0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25900 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  Noop */.    }.  
25910 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f  }.#endif.  winLo
25920 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20  gIoerr(cnt);..  
25930 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66  OSTRACE(("OPEN f
25940 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c  ile=%p, name=%s,
25950 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d   access=%lx, rc=
25960 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e  %s\n", h, zUtf8N
25970 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
25980 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
25990 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e   (h==INVALID_HAN
259a0 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61  DLE_VALUE) ? "fa
259b0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
259c0 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
259d0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
259e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
259f0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
25a00 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
25a10 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
25a20 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  PEN, pFile->last
25a30 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22  Errno, "winOpen"
25a40 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
25a50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25a60 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
25a70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
25a80 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pname);.    if( 
25a90 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
25aa0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
25ab0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f       return winO
25ac0 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  pen(pVfs, zName,
25ad0 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28 28   id,.         ((
25ae0 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45  flags|SQLITE_OPE
25af0 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20  N_READONLY) &.  
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b10 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e     ~(SQLITE_OPEN
25b20 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f  _CREATE|SQLITE_O
25b30 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c  PEN_READWRITE)),
25b40 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c  .         pOutFl
25b50 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ags);.    }else{
25b60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25b70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
25b80 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
25b90 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
25ba0 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  {.    if( isRead
25bb0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  Write ){.      *
25bc0 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
25bd0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
25be0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
25bf0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
25c00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
25c10 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  DONLY;.    }.  }
25c20 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
25c30 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
25c40 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
25c50 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a   pOutFlags=%p, *
25c60 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a  pOutFlags=%d, ".
25c70 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 25             "rc=%
25c80 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61  s\n", h, zUtf8Na
25c90 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63  me, dwDesiredAcc
25ca0 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20  ess, pOutFlags, 
25cb0 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20  pOutFlags ?.    
25cc0 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67         *pOutFlag
25cd0 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c  s : 0, (h==INVAL
25ce0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29  ID_HANDLE_VALUE)
25cf0 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
25d00 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  k"));..#if SQLIT
25d10 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28  E_OS_WINCE.  if(
25d20 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
25d30 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25d40 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
25d50 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65    && (rc = wince
25d60 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
25d70 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54  , pFile))!=SQLIT
25d80 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73  E_OK.  ){.    os
25d90 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a  CloseHandle(h);.
25da0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25db0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
25dc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25dd0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
25de0 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d  TRACE(("OPEN-CE-
25df0 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LOCK name=%s, rc
25e00 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73  =%s\n", zName, s
25e10 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
25e20 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
25e30 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rc;.  }.  if( is
25e40 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
25e50 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
25e60 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
25e70 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
25e80 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   {.    sqlite3_f
25e90 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
25ea0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
25eb0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
25ec0 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
25ed0 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
25ee0 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
25ef0 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
25f00 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52  h = h;.  if( isR
25f10 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadonly ){.    p
25f20 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
25f30 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  |= WINFILE_RDONL
25f40 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  Y;.  }.  if( sql
25f50 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
25f60 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20  (zName, "psow", 
25f70 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
25f80 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
25f90 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
25fa0 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50  ags |= WINFILE_P
25fb0 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  SOW;.  }.  pFile
25fc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
25fd0 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
25fe0 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
25ff0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
26000 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69  MAP_SIZE>0.  pFi
26010 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  le->hMap = NULL;
26020 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  .  pFile->pMapRe
26030 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c  gion = 0;.  pFil
26040 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b  e->mmapSize = 0;
26050 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
26060 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
26070 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
26080 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
26090 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
260a0 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43  .#endif..  OpenC
260b0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
260c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
260d0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
260e0 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
260f0 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
26100 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
26110 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
26120 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
26130 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
26140 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
26150 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
26160 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
26170 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
26180 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
26190 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
261a0 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
261b0 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
261c0 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
261d0 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
261e0 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
261f0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
26200 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
26210 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
26220 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
26230 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
26240 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
26250 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
26260 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
26270 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
26280 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
26290 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
262a0 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
262b0 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
262c0 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
262d0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
262e0 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
262f0 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
26300 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
26310 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
26320 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
26330 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
26340 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
26350 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
26360 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
26370 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26390 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
263a0 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
263b0 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
263c0 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
263d0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
263e0 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
263f0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
26400 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
26410 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
26420 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
26430 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
26440 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
26450 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
26460 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
26470 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79  LETE name=%s, sy
26480 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69  ncDir=%d\n", zFi
26490 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29  lename, syncDir)
264a0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
264b0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
264c0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
264d0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
264e0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
264f0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
26500 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
26510 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26520 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
26530 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
26540 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26550 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
26560 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64  sIsNT() ){.    d
26570 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
26580 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
26590 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
265a0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
265b0 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
265c0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
265d0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
265e0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
265f0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
26600 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
26610 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
26620 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26640 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
26650 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
26660 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
26670 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
26680 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
26690 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
266a0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
266b0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
266c0 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
266d0 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
266e0 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
266f0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
26700 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
26710 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26720 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
26730 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
26740 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
26750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26760 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26770 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
26790 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c  eak;.      }.#el
267a0 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20  se.      attr = 
267b0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
267c0 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
267d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
267e0 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
267f0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
26800 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
26810 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
26820 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
26830 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
26840 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
26850 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
26860 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
26870 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
26880 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
26890 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
268a0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
268b0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
268c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
268d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
268e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
268f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26900 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26910 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
26920 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
26930 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
26940 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26950 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
26960 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
26970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26980 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
26990 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
269a0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
269b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
269c0 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
269d0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
269e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
269f0 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
26a00 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26a10 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
26a20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26a30 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
26a40 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
26a50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26a60 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
26a70 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
26a80 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
26a90 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
26aa0 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d  o {.      attr =
26ab0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
26ac0 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64  utesA(zConverted
26ad0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
26ae0 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
26af0 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
26b00 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
26b10 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
26b20 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
26b30 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
26b40 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
26b50 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
26b60 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
26b70 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
26b80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26b90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
26ba0 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
26bb0 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
26bc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26bd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26be0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
26bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
26c00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26c10 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
26c20 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
26c30 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
26c40 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
26c50 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
26c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
26c70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26c80 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
26c90 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
26ca0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26cb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
26cc0 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
26cd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26ce0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
26cf0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
26d00 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
26d10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26d20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
26d30 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
26d40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
26d50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26d60 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
26d70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
26d80 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
26d90 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
26da0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
26db0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
26dc0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61  IOERR_DELETE, la
26dd0 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c  stErrno, "winDel
26de0 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
26df0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
26e00 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b  inLogIoerr(cnt);
26e10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
26e20 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26e30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
26e40 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  ETE name=%s, rc=
26e50 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
26e60 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
26e70 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
26e80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
26e90 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63  eck the existenc
26ea0 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
26eb0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
26ec0 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
26ed0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
26ee0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
26ef0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
26f00 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
26f10 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
26f20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
26f30 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
26f40 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
26f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26f60 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
26f70 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
26f80 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
26f90 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
26fa0 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
26fb0 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
26fc0 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
26fd0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
26fe0 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
26ff0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
27000 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27010 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  pVfs);..  Simula
27020 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
27030 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
27040 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52  CCESS; );.  OSTR
27050 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
27060 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%s, flags=%x, 
27070 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20  pResOut=%p\n",. 
27080 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
27090 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ame, flags, pRes
270a0 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Out));..  zConve
270b0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
270c0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
270d0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
270e0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
270f0 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
27100 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25  (("ACCESS name=%
27110 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
27120 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
27130 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
27140 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27150 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
27160 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
27170 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
27180 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
27190 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
271a0 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
271b0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
271c0 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
271d0 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
271e0 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
271f0 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
27200 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
27210 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27230 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
27240 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
27250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27260 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
27270 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f  )) && winRetryIo
27280 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
27290 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
272a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
272b0 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41   For an SQLITE_A
272c0 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65  CCESS_EXISTS que
272d0 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f  ry, treat a zero
272e0 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20  -length file.   
272f0 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64     ** as if it d
27300 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
27310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27320 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49  (    flags==SQLI
27330 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
27340 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
27350 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
27360 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20  eHigh==0.       
27370 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
27380 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
27390 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
273a0 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
273b0 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
273c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
273d0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
273e0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
273f0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
27400 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c  else{.      winL
27410 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
27420 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
27430 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o!=ERROR_FILE_NO
27440 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45  T_FOUND && lastE
27450 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48  rrno!=ERROR_PATH
27460 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
27470 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27480 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
27490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
274a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
274b0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
274c0 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
274d0 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20  ccess",.        
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
27500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27510 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
27520 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
27530 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
27540 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
27550 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
27560 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
27570 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
27580 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
27590 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
275a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
275b0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
275c0 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
275d0 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
275e0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
275f0 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
27600 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
27610 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
27620 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
27630 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
27640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27650 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
27660 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
27670 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
27680 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
27690 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
276a0 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
276b0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
276c0 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
276d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
276e0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
276f0 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
27700 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
27710 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
27720 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  rc;.  OSTRACE(("
27730 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
27740 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
27750 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
27760 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
27770 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
27780 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
27790 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
277a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
277b0 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
277c0 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
277d0 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74  ied path name st
277e0 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
277f0 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c  e letter.** foll
27800 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20  owed by a colon 
27810 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
27820 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
27830 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
27840 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on(.  const char
27850 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
27860 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65   return ( sqlite
27870 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61  3Isalpha(zPathna
27880 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e  me[0]) && zPathn
27890 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d  ame[1]==':' );.}
278a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
278b0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
278c0 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
278d0 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
278e0 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
278f0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
27900 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
27910 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
27920 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
27930 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
27940 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
27950 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
27960 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
27970 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
27980 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
27990 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
279a0 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
279b0 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
279c0 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
279d0 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
279e0 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
279f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27a00 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
27a10 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
27a20 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
27a30 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
27a40 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
27a50 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
27a60 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
27a70 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
27a80 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
27a90 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
27aa0 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
27ab0 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
27ac0 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
27ad0 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
27ae0 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
27af0 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
27b00 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
27b10 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
27b20 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
27b30 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
27b40 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
27b50 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
27b60 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
27b70 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
27b80 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
27b90 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
27ba0 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b  irSep(zPathname[
27bb0 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0]) ){.    retur
27bc0 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
27bd0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
27be0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
27bf0 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
27c00 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
27c10 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
27c20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
27c30 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
27c40 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
27c50 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
27c60 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
27c70 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
27c80 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
27c90 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
27ca0 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
27cb0 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
27cc0 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
27cd0 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76    if ( winIsDriv
27ce0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
27cf0 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20  zPathname) ){.  
27d00 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
27d10 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
27d20 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20   we get to this 
27d30 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20  point, the path 
27d40 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f  name should almo
27d50 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20  st certainly be 
27d60 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65  a purely.  ** re
27d70 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e  lative one (i.e.
27d80 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c   not a UNC name,
27d90 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61   not absolute, a
27da0 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65  nd not volume re
27db0 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20  lative)..  */.  
27dc0 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
27dd0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
27de0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
27df0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
27e00 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
27e10 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
27e20 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
27e30 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
27e40 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
27e50 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
27e60 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
27e70 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
27e80 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
27e90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
27ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
27eb0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
27ec0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
27ed0 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
27ee0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
27ef0 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
27f00 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
27f10 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
27f20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27f30 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
27f40 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
27f50 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f70 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
27f80 2f 0a 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  /.){..#if define
27f90 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
27fa0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
27fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27fc0 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
27fd0 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
27fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75  );.  assert( nFu
27ff0 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll>=pVfs->mxPath
28000 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73  name );.  if ( s
28010 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
28020 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
28030 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
28040 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
28050 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
28060 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
28070 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
28080 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
28090 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
280a0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
280b0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
280c0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
280d0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
280e0 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
280f0 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
28100 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
28110 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
28120 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
28130 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
28140 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
28150 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20   and a slash..  
28160 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
28170 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Out = sqlite3Mal
28180 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d  locZero( pVfs->m
28190 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20  xPathname+1 );. 
281a0 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a     if( !zOut ){.
281b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
281c0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
281d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
281e0 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
281f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73  .            (os
28200 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
28210 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
28220 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
28230 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
28240 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52  CCP_RELATIVE, zR
28250 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70  elative, zOut, p
28260 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
28270 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  1)<0 ){.      sq
28280 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
28290 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
282a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
282b0 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
282c0 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
282d0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
282e0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
282f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
28300 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
28310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
28320 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
28330 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
28340 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ame(zOut);.     
28350 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
28360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
28370 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
28380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28390 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
283a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
283b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
283c0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
283d0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
283e0 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
28410 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
28420 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38  tDirSep(), zUtf8
28430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28440 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
28450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28460 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
28470 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
28480 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zOut = sqlite3M
28490 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d  allocZero( pVfs-
284a0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b  >mxPathname+1 );
284b0 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
284c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
284d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
284e0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
284f0 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
28500 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  h(.            (
28510 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
28520 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
28530 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
28540 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _A),.           
28550 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
28560 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
28570 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
28580 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
28590 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
285a0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
285b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
285c0 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
285d0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
285f0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
28600 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
28610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28620 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
28630 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
28640 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
28650 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
28660 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28670 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
28680 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28690 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
286a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
286b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
286c0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
286d0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
286e0 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  ull, "%s", zUtf8
286f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28700 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
28710 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28720 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
28730 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
28740 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
28750 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f (SQLITE_OS_WIN
28760 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
28770 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e  WINRT) && !defin
28780 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
28790 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
287a0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
287b0 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69  ERROR );.  /* Wi
287c0 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
287d0 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
287e0 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
287f0 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
28800 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f   /* WinRT has no
28810 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   way to convert 
28820 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
28830 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f  to an absolute o
28840 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ne. */.  if ( sq
28850 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
28860 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
28870 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
28880 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
28890 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
288a0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
288b0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
288c0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
288d0 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
288e0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
288f0 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
28900 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
28910 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
28920 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
28930 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
28940 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
28950 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
28960 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
28970 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
28980 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
28990 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
289a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
289b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
289c0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
289d0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
289e0 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
28a10 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
28a20 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69  irSep(), zRelati
28a30 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ve);.  }else{.  
28a40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
28a50 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
28a60 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
28a70 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
28a80 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20  elative);.  }.  
28a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28aa0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ;.#endif..#if !S
28ab0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
28ac0 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
28ad0 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
28ae0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f  _CYGWIN__).  DWO
28af0 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  RD nByte;.  void
28b00 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
28b10 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f  char *zOut;..  /
28b20 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
28b30 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
28b40 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
28b50 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
28b60 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
28b70 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
28b80 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
28b90 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
28ba0 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
28bb0 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69  ve[0]=='/' && wi
28bc0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
28bd0 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65  dColon(zRelative
28be0 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  +1) ){.    zRela
28bf0 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  tive++;.  }..  /
28c00 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
28c10 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
28c20 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
28c30 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
28c40 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
28c50 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
28c60 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
28c70 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
28c80 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
28c90 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
28ca0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
28cb0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
28cc0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
28cd0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
28ce0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
28cf0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
28d00 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
28d10 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
28d20 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
28d30 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
28d40 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
28d50 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
28d60 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
28d70 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
28d80 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
28d90 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
28da0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
28db0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
28dc0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
28dd0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
28de0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
28df0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
28e00 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
28e10 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
28e20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
28e30 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
28e40 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
28e50 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
28e60 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
28e70 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
28e80 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
28e90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28ea0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
28eb0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28ec0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
28ed0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
28ee0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28ef0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
28f00 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
28f10 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
28f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28f30 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  K;.  }.  zConver
28f40 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
28f50 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
28f60 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
28f70 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
28f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
28fa0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
28fb0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
28fc0 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
28fd0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
28fe0 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
28ff0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
29000 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
29010 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
29020 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29030 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
29040 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
29050 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
29060 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
29070 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
29080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29090 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
290a0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
290b0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
290c0 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
290d0 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
290e0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
290f0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
29100 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
29110 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
29120 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29130 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
29140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29150 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
29160 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
29170 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
29180 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
29190 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
291a0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
291b0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
291c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
291d0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
291e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
291f0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
29200 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
29210 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
29220 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
29230 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29250 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
29260 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
29270 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
29280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29290 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
292a0 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
292b0 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
292c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
292d0 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66  (zTemp);.  }.#if
292e0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
292f0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
29300 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
29310 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
29320 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
29330 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
29340 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
29350 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
29360 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29370 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29380 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29390 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
293a0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
293b0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
293c0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
293d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293e0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
293f0 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e3", zRelative);
29400 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
29410 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
29420 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
29430 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
29440 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
29450 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
29460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29470 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29480 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
29490 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
294a0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
294b0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
294c0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
294d0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
294e0 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
294f0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
29500 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29510 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29520 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29530 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
29540 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
29550 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
29560 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
29570 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
29580 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
29590 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
295a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20  FullPathname4", 
295b0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
295c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
295d0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
295e0 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
295f0 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
29600 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
29610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29620 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
29630 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
29640 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29650 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
29660 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
29670 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
29680 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
29690 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
296a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
296b0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
296c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
296d0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
296e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64  .#endif.}..#ifnd
296f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
29700 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
29710 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
29720 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
29730 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
29740 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
29750 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
29760 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
29770 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
29780 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
29790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
297a0 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  winDlOpen(sqlite
297b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
297c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
297d0 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  me){.  HANDLE h;
297e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
297f0 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e  YGWIN__).  int n
29800 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50  Full = pVfs->mxP
29810 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61  athname+1;.  cha
29820 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74  r *zFull = sqlit
29830 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46  e3MallocZero( nF
29840 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a  ull );.  void *z
29850 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
29860 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b   if( zFull==0 ){
29870 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
29880 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
29890 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
298a0 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
298b0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
298c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 46  ;.  }.  if( winF
298d0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
298e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
298f0 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49  ll, zFull)!=SQLI
29900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
29910 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29  ite3_free(zFull)
29920 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
29930 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
29940 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
29950 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
29960 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
29970 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  0;.  }.  zConver
29980 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
29990 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
299a0 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  (zFull);.  sqlit
299b0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a  e3_free(zFull);.
299c0 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43  #else.  void *zC
299d0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
299e0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
299f0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
29a00 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29a10 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e 64  ETER(pVfs);.#end
29a20 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  if.  if( zConver
29a30 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
29a40 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
29a50 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
29a60 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
29a70 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
29a80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
29a90 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
29aa0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
29ab0 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c  INRT.    h = osL
29ac0 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
29ad0 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  ry((LPCWSTR)zCon
29ae0 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73  verted, 0);.#els
29af0 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  e.    h = osLoad
29b00 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54  LibraryW((LPCWST
29b10 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  R)zConverted);.#
29b20 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
29b30 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
29b40 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
29b50 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
29b60 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
29b70 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
29b80 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
29b90 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
29ba0 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
29bb0 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
29bc0 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )h));.  sqlite3_
29bd0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29be0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
29bf0 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  *)h;.}.static vo
29c00 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71  id winDlError(sq
29c10 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29c20 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
29c30 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55  *zBufOut){.  UNU
29c40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29c50 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73  fs);.  winGetLas
29c60 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
29c70 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
29c80 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74  , zBufOut);.}.st
29c90 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44  atic void (*winD
29ca0 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
29cb0 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c   *pVfs,void *pH,
29cc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
29cd0 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 50  ))(void){.  FARP
29ce0 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53  ROC proc;.  UNUS
29cf0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29d00 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47  s);.  proc = osG
29d10 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28  etProcAddressA((
29d20 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29  HANDLE)pH, zSym)
29d30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
29d40 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73  SYM handle=%p, s
29d50 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73  ymbol=%s, addres
29d60 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%p\n",.       
29d70 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a      (void*)pH, z
29d80 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63  Sym, (void*)proc
29d90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  ));.  return (vo
29da0 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f 63  id(*)(void))proc
29db0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
29dc0 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
29dd0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
29de0 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
29df0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29e00 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65  (pVfs);.  osFree
29e10 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29  Library((HANDLE)
29e20 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52  pHandle);.  OSTR
29e30 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 61  ACE(("DLCLOSE ha
29e40 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69  ndle=%p\n", (voi
29e50 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a  d*)pHandle));.}.
29e60 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
29e70 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
29e80 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
29e90 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
29ea0 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
29eb0 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
29ec0 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
29ed0 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
29ee0 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
29ef0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
29f00 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
29f10 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
29f20 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
29f30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29f40 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
29f50 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
29f60 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
29f70 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
29f80 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
29f90 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
29fa0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
29fb0 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
29fc0 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
29fd0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
29fe0 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
29ff0 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
2a000 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
2a010 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
2a020 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
2a030 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
2a040 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
2a050 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
2a060 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
2a070 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
2a080 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
2a090 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
2a0a0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
2a0b0 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
2a0c0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
2a0d0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
2a0e0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
2a0f0 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  id);.  }.#if SQL
2a100 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
2a110 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c  f( sizeof(ULONGL
2a120 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ONG)<=nBuf-n ){.
2a130 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e      ULONGLONG cn
2a140 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
2a150 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63  nt64();.    memc
2a160 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
2a170 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
2a180 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
2a190 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  (cnt);.  }.#else
2a1a0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
2a1b0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
2a1c0 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
2a1d0 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
2a1e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
2a1f0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
2a200 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
2a210 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
2a220 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2a230 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  ( sizeof(LARGE_I
2a240 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20  NTEGER)<=nBuf-n 
2a250 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54  ){.    LARGE_INT
2a260 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75  EGER i;.    osQu
2a270 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
2a280 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d  unter(&i);.    m
2a290 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
2a2a0 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a  &i, sizeof(i));.
2a2b0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
2a2c0 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i);.  }.#endif. 
2a2d0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
2a2e0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
2a2f0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
2a300 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
2a310 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
2a320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2a330 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
2a340 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
2a350 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69  icrosec){.  sqli
2a360 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
2a370 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
2a380 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
2a390 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2a3a0 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
2a3b0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
2a3c0 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
2a3d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2a3e0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
2a3f0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
2a400 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
2a410 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
2a420 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
2a430 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
2a440 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
2a450 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
2a460 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
2a470 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
2a480 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
2a490 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
2a4a0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2a4b0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
2a4c0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
2a4d0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2a4e0 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
2a4f0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2a500 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2a510 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2a520 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2a530 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
2a540 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2a550 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
2a560 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
2a570 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
2a580 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
2a590 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
2a5a0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
2a5b0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
2a5c0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
2a5d0 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
2a5e0 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
2a5f0 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
2a600 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
2a610 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
2a620 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
2a630 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
2a640 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
2a650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a660 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
2a670 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
2a680 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a 20  ime and date.** 
2a690 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
2a6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2a6b0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2a6c0 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
2a6d0 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
2a6e0 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
2a6f0 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
2a700 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
2a710 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
2a720 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
2a730 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73  f.     100-nanos
2a740 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
2a750 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
2a760 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
2a770 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20 46  813.5)..  */.  F
2a780 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74  ILETIME ft;.  st
2a790 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a7a0 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65  e3_int64 winFile
2a7b0 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35  timeEpoch = 2305
2a7c0 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  8135*(sqlite3_in
2a7d0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
2a7e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2a7f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2a800 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
2a810 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
2a820 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
2a830 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66  )8640000;.#endif
2a840 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20  .  /* 2^32 - to 
2a850 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20  avoid use of LL 
2a860 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20  and warnings in 
2a870 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  gcc */.  static 
2a880 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
2a890 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75  t64 max32BitValu
2a8a0 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c 69 74  e =.      (sqlit
2a8b0 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
2a8c0 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
2a8d0 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
2a8e0 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  +.      (sqlite3
2a8f0 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36  _int64)294967296
2a900 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
2a910 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54  _WINCE.  SYSTEMT
2a920 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65  IME time;.  osGe
2a930 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d  tSystemTime(&tim
2a940 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74  e);.  /* if Syst
2a950 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
2a960 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74  () fails, it ret
2a970 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  urns zero. */.  
2a980 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d  if (!osSystemTim
2a990 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
2a9a0 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74  e,&ft)){.    ret
2a9b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2a9c0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73  ;.  }.#else.  os
2a9d0 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
2a9e0 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
2a9f0 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77  #endif..  *piNow
2aa00 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70   = winFiletimeEp
2aa10 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20  och +.          
2aa20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e    ((((sqlite3_in
2aa30 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74  t64)ft.dwHighDat
2aa40 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56  eTime)*max32BitV
2aa50 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20 20 20  alue) +.        
2aa60 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2aa70 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61  int64)ft.dwLowDa
2aa80 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33  teTime)/(sqlite3
2aa90 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23  _int64)10000;..#
2aaa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2aab0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
2aac0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
2aad0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
2aae0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
2aaf0 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
2ab00 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
2ab10 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
2ab20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ab30 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
2ab40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2ab50 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2ab60 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2ab70 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2ab80 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2ab90 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
2aba0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2abb0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2abc0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
2abd0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
2abe0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
2abf0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2ac00 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
2ac10 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2ac20 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2ac30 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2ac40 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
2ac50 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
2ac60 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
2ac70 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
2ac80 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
2ac90 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
2aca0 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
2acb0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
2acc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2acd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
2ace0 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
2acf0 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
2ad00 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
2ad10 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
2ad20 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
2ad30 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e  Message() on Win
2ad40 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
2ad50 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
2ad60 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74  () on Unix). Aft
2ad70 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
2ad80 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
2ad90 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
2ada0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
2adb0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
2adc0 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
2add0 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
2ade0 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
2adf0 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
2ae00 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
2ae10 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
2ae20 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
2ae30 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
2ae40 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
2ae50 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
2ae60 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
2ae70 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
2ae80 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
2ae90 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
2aea0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2aeb0 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
2aec0 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
2aed0 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
2aee0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
2aef0 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
2af00 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
2af10 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
2af20 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2af30 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
2af40 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
2af50 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
2af60 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
2af70 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
2af80 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
2af90 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
2afa0 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
2afb0 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
2afc0 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
2afd0 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
2afe0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
2aff0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
2b000 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
2b010 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
2b020 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
2b030 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
2b040 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
2b050 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
2b060 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
2b070 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
2b080 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2b090 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
2b0a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
2b0b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2b0c0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2b0d0 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
2b0e0 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
2b0f0 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
2b100 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
2b110 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
2b120 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2b130 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
2b140 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
2b150 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
2b160 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
2b170 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
2b180 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
2b190 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
2b1a0 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
2b1b0 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
2b1c0 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
2b1d0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
2b1e0 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
2b1f0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2b200 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2b210 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
2b220 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b230 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  Vfs);.  return w
2b240 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
2b250 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
2b260 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b  (), nBuf, zBuf);
2b270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
2b280 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
2b290 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
2b2a0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
2b2b0 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
2b2c0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
2b2d0 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
2b2e0 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
2b2f0 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b310 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2b320 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2b330 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2b340 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2b350 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
2b360 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2b370 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b390 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2b3a0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
2b3b0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2b3c0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
2b3e0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2b3f0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2b400 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2b410 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2b420 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2b430 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2b440 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2b450 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2b460 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2b470 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2b480 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2b490 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2b4a0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2b4b0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2b4c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2b4d0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2b4e0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2b4f0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2b500 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2b510 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2b520 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2b530 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2b540 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2b550 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2b560 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2b570 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2b580 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2b590 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2b5a0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2b5b0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
2b5c0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2b5d0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2b5e0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
2b5f0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
2b600 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
2b610 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
2b620 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b630 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2b640 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
2b650 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2b660 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2b670 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
2b680 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2b690 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2b6a0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2b6b0 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  E).  static sqli
2b6c0 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50  te3_vfs winLongP
2b6d0 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  athVfs = {.    3
2b6e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b6f0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2b700 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2b710 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
2b720 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2b730 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
2b740 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2b750 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2b760 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2b770 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
2b780 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e  /.    "win32-lon
2b790 67 70 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e  gpath",    /* zN
2b7a0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7c0 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2b7d0 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2b7e0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2b7f0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2b800 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
2b810 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
2b820 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
2b830 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
2b840 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
2b850 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
2b860 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2b870 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2b880 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2b890 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2b8a0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
2b8b0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
2b8c0 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
2b8d0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2b8e0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2b8f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2b900 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2b910 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2b920 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2b930 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2b940 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2b950 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
2b960 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
2b970 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
2b980 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
2b990 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
2b9a0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2b9b0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2b9c0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
2b9d0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2b9e0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2b9f0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2ba00 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
2ba10 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
2ba20 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2ba30 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2ba40 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2ba50 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
2ba60 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
2ba70 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20  /.  };.#endif.. 
2ba80 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b   /* Double-check
2ba90 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61   that the aSysca
2baa0 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62  ll[] array has b
2bab0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  een constructed.
2bac0 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
2bad0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33   See ticket [bb3
2bae0 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20  a86e890c8e96ab] 
2baf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  */.  assert( Arr
2bb00 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
2bb10 3d 3d 37 37 20 29 3b 0a 0a 20 20 2f 2a 20 67 65  ==77 );..  /* ge
2bb20 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
2bb30 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
2bb40 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
2bb50 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
2bb60 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
2bb70 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  FO));.#if SQLITE
2bb80 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65  _OS_WINRT.  osGe
2bb90 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
2bba0 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
2bbb0 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
2bbc0 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
2bbd0 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nfo);.#endif.  a
2bbe0 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
2bbf0 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
2bc00 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20  anularity>0 );. 
2bc10 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
2bc20 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30  nfo.dwPageSize>0
2bc30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   );..  sqlite3_v
2bc40 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
2bc50 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65  Vfs, 1);..#if de
2bc60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2bc70 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
2bc80 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
2bc90 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68  ter(&winLongPath
2bca0 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  Vfs, 0);.#endif.
2bcb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2bcc0 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  _OK;.}..int sqli
2bcd0 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
2bce0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
2bcf0 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
2bd00 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj!=NULL ){.  
2bd10 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
2bd20 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
2bd30 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
2bd40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2bd50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2bd60 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2bd70 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.