/ Hex Artifact Content
Login

Artifact 1a38ad1288b4b263c85d124093b8a6f59702925b:


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 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
9b70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
9b80: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
9b90: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
9ba0: 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  Mem = sqlite3Mut
9bb0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
9bc0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29  UTEX_STATIC_MEM)
9bd0: 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
9be0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
9bf0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  r);.  sqlite3_mu
9c00: 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29 3b  tex_enter(pMem);
9c10: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
9c20: 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77 69  agic();.  if( wi
9c30: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
9c40: 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65 74  ULL && winMemGet
9c50: 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69 74  Owned() && sqlit
9c60: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
9c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
9c80: 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69    ** At this poi
9c90: 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64  nt, there should
9ca0: 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
9cb0: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
9cc0: 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a 20  tions on.    ** 
9cd0: 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f 2c  the heap.  Also,
9ce0: 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65 20   since both the 
9cf0: 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73 79  master and memsy
9d00: 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72 72  s locks are curr
9d10: 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65 69  ently.    ** bei
9d20: 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20 6e  ng held by us, n
9d30: 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e  o other function
9d40: 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f 74   (i.e. from anot
9d50: 68 65 72 20 74 68 72 65 61 64 29 20 73 68 6f 75  her thread) shou
9d60: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62 6c  ld.    ** be abl
9d70: 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73 73  e to even access
9d80: 20 74 68 65 20 68 65 61 70 2e 20 20 41 74 74 65   the heap.  Atte
9d90: 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20 61  mpt to destroy a
9da0: 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75 72 0a  nd recreate our.
9db0: 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64 20      ** isolated 
9dc0: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9dd0: 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  p now..    */.  
9de0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
9df0: 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20  GetHeap()!=NULL 
9e00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  );.    assert( w
9e10: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
9e20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9e30: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
9e40: 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77  ed()==0 );.    w
9e50: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77 69  inMemShutdown(wi
9e60: 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29  nMemGetDataPtr()
9e70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  );.    assert( w
9e80: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d 3d  inMemGetHeap()==
9e90: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
9ea0: 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f 77  rt( !winMemGetOw
9eb0: 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73  ned() );.    ass
9ec0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ert( sqlite3_mem
9ed0: 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b  ory_used()==0 );
9ee0: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65 6d  .    rc = winMem
9ef0: 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44 61  Init(winMemGetDa
9f00: 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73  taPtr());.    as
9f10: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
9f20: 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74  _OK || winMemGet
9f30: 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a  Heap()!=NULL );.
9f40: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9f50: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e  SQLITE_OK || win
9f60: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b  MemGetOwned() );
9f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
9f80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
9f90: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
9fa0: 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  d()==0 );.  }els
9fb0: 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e{.    /*.    **
9fc0: 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   The Win32 nativ
9fd0: 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62 65  e heap cannot be
9fe0: 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75 73   modified becaus
9ff0: 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 75  e it may be in u
a000: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
a010: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
a020: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
a030: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d 29  utex_leave(pMem)
a040: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a050: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
a060: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a070: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a080: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
a090: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
a0a0: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
a0b0: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
a0c0: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
a0d0: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
a0e0: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
a0f0: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
a100: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
a110: 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61  _debug(const cha
a120: 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75  r *zBuf, int nBu
a130: 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42  f){.  char zDbgB
a140: 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  uf[SQLITE_WIN32_
a150: 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20  DBG_BUF_SIZE];. 
a160: 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
a170: 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49  nBuf, (SQLITE_WI
a180: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a190: 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62   - 1)); /* may b
a1a0: 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20  e negative. */. 
a1b0: 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e   if( nMin<-1 ) n
a1c0: 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c  Min = -1; /* all
a1d0: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73   negative values
a1e0: 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20   become -1. */. 
a1f0: 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d   assert( nMin==-
a200: 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20  1 || nMin==0 || 
a210: 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33  nMin<SQLITE_WIN3
a220: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29  2_DBG_BUF_SIZE )
a230: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
a240: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
a250: 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  NSI).  if( nMin>
a260: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
a270: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
a280: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
a290: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
a2a0: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
a2b0: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f  , nMin);.    osO
a2c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
a2d0: 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  A(zDbgBuf);.  }e
a2e0: 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75  lse{.    osOutpu
a2f0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42  tDebugStringA(zB
a300: 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64  uf);.  }.#elif d
a310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
a320: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
a330: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
a340: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
a350: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
a360: 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74   if ( osMultiByt
a370: 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20  eToWideChar(.   
a380: 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65         osAreFile
a390: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
a3a0: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20  ACP : CP_OEMCP, 
a3b0: 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  0, zBuf,.       
a3c0: 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52     nMin, (LPWSTR
a3d0: 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45  )zDbgBuf, SQLITE
a3e0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
a3f0: 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52  IZE/sizeof(WCHAR
a400: 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))<=0 ){.    ret
a410: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74  urn;.  }.  osOut
a420: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28  putDebugStringW(
a430: 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66  (LPCWSTR)zDbgBuf
a440: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e  );.#else.  if( n
a450: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
a460: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
a470: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a480: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
a490: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
a4a0: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
a4b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
a4c0: 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b   "%s", zDbgBuf);
a4d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
a4e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
a4f0: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  s", zBuf);.  }.#
a500: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
a510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a520: 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68  tine suspends th
a530: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
a540: 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73   for at least ms
a550: 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  .** milliseconds
a560: 2e 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76  .  This is equiv
a570: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e  alent to the Win
a580: 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72  32 Sleep() inter
a590: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  face..*/.#if SQL
a5a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61  ITE_OS_WINRT.sta
a5b0: 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70  tic HANDLE sleep
a5c0: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  Obj = NULL;.#end
a5d0: 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  if..void sqlite3
a5e0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f  _win32_sleep(DWO
a5f0: 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  RD milliseconds)
a600: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
a610: 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65  WINRT.  if ( sle
a620: 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj==NULL ){. 
a630: 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73     sleepObj = os
a640: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e  CreateEventExW(N
a650: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54  ULL, NULL, CREAT
a660: 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52  E_EVENT_MANUAL_R
a670: 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ESET,.          
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a        SYNCHRONIZ
a6a0: 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  E);.  }.  assert
a6b0: 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
a6c0: 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53   );.  osWaitForS
a6d0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c  ingleObjectEx(sl
a6e0: 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63  eepObj, millisec
a6f0: 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65  onds, FALSE);.#e
a700: 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69  lse.  osSleep(mi
a710: 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e  lliseconds);.#en
a720: 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
a730: 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
a740: 45 41 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54  EADS>0 && !SQLIT
a750: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
a760: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
a770: 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  & \.        SQLI
a780: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
a790: 44 57 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e  DWORD sqlite3Win
a7a0: 33 32 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f  32Wait(HANDLE hO
a7b0: 62 6a 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20  bject){.  DWORD 
a7c0: 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63  rc;.  while( (rc
a7d0: 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
a7e0: 6c 65 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65  leObjectEx(hObje
a7f0: 63 74 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20  ct, INFINITE,.  
a800: 20 20 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 54 52 55 45 29 29 3d 3d 57 41 49       TRUE))==WAI
a830: 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20  T_IO_COMPLETION 
a840: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ){}.  return rc;
a850: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
a860: 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
a870: 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72  n-zero) if we ar
a880: 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20  e running under 
a890: 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69  WinNT, Win2K, Wi
a8a0: 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45  nXP,.** or WinCE
a8b0: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
a8c0: 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35  (zero) for Win95
a8d0: 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d  , Win98, or WinM
a8e0: 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73  E..**.** Here is
a8f0: 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20   an interesting 
a900: 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69  observation:  Wi
a910: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20  n95, Win98, and 
a920: 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68  WinME lack.** th
a930: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
a940: 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20  PI.  But we can 
a950: 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79  still statically
a960: 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68   link against th
a970: 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e  at.** API as lon
a980: 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61  g as we don't ca
a990: 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69  ll it when runni
a9a0: 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20  ng Win95/98/ME. 
a9b0: 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68   A call to.** th
a9c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a9d0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a9e0: 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57  if the host is W
a9f0: 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a  in95/98/ME or.**
aa00: 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20   WinNT/2K/XP so 
aa10: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  that we will kno
aa20: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
aa30: 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63   we can safely c
aa40: 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  all.** the LockF
aa50: 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a  ileEx() API..*/.
aa60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
aa70: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
aa80: 52 53 49 4f 4e 45 58 29 20 7c 7c 20 21 53 51 4c  RSIONEX) || !SQL
aa90: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
aaa0: 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20  SIONEX.# define 
aab0: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65  osIsNT()  (1).#e
aac0: 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  lif SQLITE_OS_WI
aad0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
aae0: 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e  _WINRT || !defin
aaf0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
ab00: 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69  HAS_ANSI).# defi
ab10: 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29  ne osIsNT()  (1)
ab20: 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28  .#elif !defined(
ab30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
ab40: 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20  _WIDE).# define 
ab50: 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65  osIsNT()  (0).#e
ab60: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  lse.# define osI
ab70: 73 4e 54 28 29 20 20 28 28 73 71 6c 69 74 65 33  sNT()  ((sqlite3
ab80: 5f 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20  _os_type==2) || 
ab90: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73  sqlite3_win32_is
aba0: 5f 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  _nt()).#endif../
abb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
abc0: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
abd0: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20   the machine is 
abe0: 72 75 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f  running a versio
abf0: 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20  n of Windows.** 
ac00: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20  based on the NT 
ac10: 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  kernel..*/.int s
ac20: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f  qlite3_win32_is_
ac30: 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51  nt(void){.#if SQ
ac40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
ac50: 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68  /*.  ** NOTE: Th
ac60: 65 20 57 69 6e 52 54 20 73 75 62 2d 70 6c 61 74  e WinRT sub-plat
ac70: 66 6f 72 6d 20 69 73 20 61 6c 77 61 79 73 20 61  form is always a
ac80: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
ac90: 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a  ed on the NT.  *
aca0: 2a 20 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a  *       kernel..
acb0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b    */.  return 1;
acc0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
acd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
ace0: 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53 51 4c  ERSIONEX) && SQL
acf0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
ad00: 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73 49  SIONEX.  if( osI
ad10: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
ad20: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
ad30: 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20 30  e3_os_type, 0, 0
ad40: 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69  )==0 ){.#if defi
ad50: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
ad60: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 4f  _HAS_ANSI).    O
ad70: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
ad80: 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64  nfo;.    sInfo.d
ad90: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
ada0: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
adb0: 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72  o);.    osGetVer
adc0: 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b  sionExA(&sInfo);
add0: 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b  .    osInterlock
ade0: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
adf0: 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  e(&sqlite3_os_ty
ae00: 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e  pe,.        (sIn
ae10: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20  fo.dwPlatformId 
ae20: 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f  == VER_PLATFORM_
ae30: 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20  WIN32_NT) ? 2 : 
ae40: 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64 65 66  1, 0);.#elif def
ae50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
ae60: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20  2_HAS_WIDE).    
ae70: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73  OSVERSIONINFOW s
ae80: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
ae90: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
aea0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
aeb0: 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65  fo);.    osGetVe
aec0: 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29  rsionExW(&sInfo)
aed0: 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63  ;.    osInterloc
aee0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
aef0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
af00: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49  ype,.        (sI
af10: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
af20: 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d   == VER_PLATFORM
af30: 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a  _WIN32_NT) ? 2 :
af40: 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   1, 0);.#endif. 
af50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e   }.  return osIn
af60: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
af70: 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65  Exchange(&sqlite
af80: 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29  3_os_type, 2, 2)
af90: 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54  ==2;.#elif SQLIT
afa0: 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20  E_TEST.  return 
afb0: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
afc0: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
afd0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32  lite3_os_type, 2
afe0: 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a 20  , 2)==2;.#else. 
aff0: 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 41   /*.  ** NOTE: A
b000: 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73  ll sub-platforms
b010: 20 77 68 65 72 65 20 74 68 65 20 47 65 74 56 65   where the GetVe
b020: 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63  rsionEx[AW] func
b030: 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 20  tions are.  **  
b040: 20 20 20 20 20 64 65 70 72 65 63 61 74 65 64 20       deprecated 
b050: 61 72 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d  are always assum
b060: 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20 6f  ed to be based o
b070: 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e  n the NT kernel.
b080: 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  .  */.  return 1
b090: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 64  ;.#endif.}..#ifd
b0a0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
b0b0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c  MALLOC./*.** All
b0c0: 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20  ocate nBytes of 
b0d0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
b0e0: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61  c void *winMemMa
b0f0: 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29  lloc(int nBytes)
b100: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
b110: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
b120: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
b130: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
b140: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
b150: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b160: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b170: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
b180: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
b190: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
b1a0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
b1b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
b1c0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
b1d0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
b1e0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
b1f0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b200: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
b210: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b220: 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70  nBytes>=0 );.  p
b230: 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68   = osHeapAlloc(h
b240: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
b250: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28  32_HEAP_FLAGS, (
b260: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
b270: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
b280: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b290: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
b2a0: 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25  d to HeapAlloc %
b2b0: 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68  u bytes (%lu), h
b2c0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
b2d0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c           nBytes,
b2e0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b2f0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
b300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
b320: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
b330: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
b340: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b  e(void *pPrior){
b350: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
b360: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
b370: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
b380: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
b390: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
b3a0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
b3b0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
b3c0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b3d0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b3e0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b3f0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b400: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b410: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
b420: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
b430: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b440: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
b450: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ) );.#endif.  if
b460: 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 75  ( !pPrior ) retu
b470: 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e  rn; /* Passing N
b480: 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20  ULL to HeapFree 
b490: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f  is undefined. */
b4a0: 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 72  .  if( !osHeapFr
b4b0: 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ee(hHeap, SQLITE
b4c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b4d0: 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20  S, pPrior) ){.  
b4e0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b4f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
b500: 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20  led to HeapFree 
b510: 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20  block %p (%lu), 
b520: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
b530: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
b540: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
b550: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
b560: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b570: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
b580: 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d  of an existing m
b590: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
b5a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b5b0: 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76  *winMemRealloc(v
b5c0: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
b5d0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
b5e0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
b5f0: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
b600: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b610: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b620: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b630: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b640: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b650: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b660: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b670: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b680: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b690: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b6a0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b6b0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b6c0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b6d0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b6e0: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
b6f0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
b700: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
b710: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20  rior ){.    p = 
b720: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
b730: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b740: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
b750: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
b760: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73  else{.    p = os
b770: 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61  HeapReAlloc(hHea
b780: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b790: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
b7a0: 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  or, (SIZE_T)nByt
b7b0: 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  es);.  }.  if( !
b7c0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
b7d0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
b7e0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73  M, "failed to %s
b7f0: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
b800: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
b810: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
b820: 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63  r ? "HeapReAlloc
b830: 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c  " : "HeapAlloc",
b840: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
b850: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
b860: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
b870: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
b880: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
b890: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
b8a0: 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e  ze of an outstan
b8b0: 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  ding allocation,
b8c0: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74   in bytes..*/.st
b8d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53  atic int winMemS
b8e0: 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  ize(void *p){.  
b8f0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
b900: 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e  SIZE_T n;..  win
b910: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
b920: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
b930: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
b940: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
b950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
b960: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
b970: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
b980: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
b990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
b9a0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
b9b0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
b9c0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
b9d0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
b9e0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b9f0: 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a  S, p) );.#endif.
ba00: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
ba10: 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61  n 0;.  n = osHea
ba20: 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c  pSize(hHeap, SQL
ba30: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
ba40: 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20  LAGS, p);.  if( 
ba50: 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b  n==(SIZE_T)-1 ){
ba60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
ba70: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
ba80: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69  failed to HeapSi
ba90: 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75  ze block %p (%lu
baa0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
bac0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
bad0: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
bae0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
baf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
bb00: 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  )n;.}../*.** Rou
bb10: 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20  nd up a request 
bb20: 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74  size to the next
bb30: 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f   valid allocatio
bb40: 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
bb50: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
bb60: 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65  dup(int n){.  re
bb70: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
bb80: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
bb90: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
bba0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
bbb0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
bbc0: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
bbd0: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
bbe0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
bbf0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
bc00: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
bc10: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
bc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
bc30: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d  MemData->magic1=
bc40: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
bc50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
bc60: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d  MemData->magic2=
bc70: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29  =WINMEM_MAGIC2 )
bc80: 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ;..#if !SQLITE_O
bc90: 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
bca0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
bcb0: 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  ATE.  if( !pWinM
bcc0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
bcd0: 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49 6e 69  .    DWORD dwIni
bce0: 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54  tialSize = SQLIT
bcf0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
bd00: 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52  T_SIZE;.    DWOR
bd10: 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20  D dwMaximumSize 
bd20: 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74 65 33  = (DWORD)sqlite3
bd30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
bd40: 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77 4d 61  ap;.    if( dwMa
bd50: 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a  ximumSize==0 ){.
bd60: 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53        dwMaximumS
bd70: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  ize = SQLITE_WIN
bd80: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
bd90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bda0: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77  dwInitialSize>dw
bdb0: 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20  MaximumSize ){. 
bdc0: 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69       dwInitialSi
bdd0: 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69  ze = dwMaximumSi
bde0: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  ze;.    }.    pW
bdf0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
be00: 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 28   = osHeapCreate(
be10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
be20: 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  P_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 64                 d
be50: 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64 77  wInitialSize, dw
be60: 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20  MaximumSize);.  
be70: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
be80: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
be90: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
bea0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20  QLITE_NOMEM,.   
beb0: 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74         "failed t
bec0: 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25 6c  o HeapCreate (%l
bed0: 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e  u), flags=%u, in
bee0: 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53  itSize=%lu, maxS
bef0: 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20  ize=%lu",.      
bf00: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
bf10: 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e  or(), SQLITE_WIN
bf20: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 64  32_HEAP_FLAGS, d
bf30: 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20  wInitialSize,.  
bf40: 20 20 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75          dwMaximu
bf50: 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  mSize);.      re
bf60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
bf70: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  M;.    }.    pWi
bf80: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
bf90: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73   = TRUE;.    ass
bfa0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
bfb0: 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a  ->bOwned );.  }.
bfc0: 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44  #else.  pWinMemD
bfd0: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47  ata->hHeap = osG
bfe0: 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b  etProcessHeap();
bff0: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
c000: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
c010: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c020: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20  LITE_NOMEM,.    
c030: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47      "failed to G
c040: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25  etProcessHeap (%
c050: 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45  lu)", osGetLastE
c060: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74  rror());.    ret
c070: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c080: 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44  ;.  }.  pWinMemD
c090: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
c0a0: 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21  LSE;.  assert( !
c0b0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c0c0: 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ned );.#endif.  
c0d0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
c0e0: 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b  ata->hHeap!=0 );
c0f0: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
c100: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
c110: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
c120: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
c130: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
c140: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
c150: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
c160: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
c170: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
c180: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c190: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c1a0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
c1b0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
c1c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c1d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61  ../*.** Deinitia
c1e0: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
c1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c200: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
c210: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
c220: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
c230: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
c240: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
c250: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
c260: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
c270: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  n;.  assert( pWi
c280: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31  nMemData->magic1
c290: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
c2a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
c2b0: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32  nMemData->magic2
c2c0: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
c2d0: 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d 65  );..  if( pWinMe
c2e0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
c2f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
c300: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c310: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
c320: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
c330: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
c340: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
c350: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
c360: 44 41 54 45 29 0a 20 20 20 20 61 73 73 65 72 74  DATE).    assert
c370: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
c380: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
c390: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c3a0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
c3b0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
c3c0: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
c3d0: 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20  a->bOwned ){.   
c3e0: 20 20 20 69 66 28 20 21 6f 73 48 65 61 70 44 65     if( !osHeapDe
c3f0: 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74  stroy(pWinMemDat
c400: 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20  a->hHeap) ){.   
c410: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
c420: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
c430: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65  failed to HeapDe
c440: 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68 65 61  stroy (%lu), hea
c450: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
c460: 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
c470: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
c480: 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d  id*)pWinMemData-
c490: 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d  >hHeap);.      }
c4a0: 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61  .      pWinMemDa
c4b0: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c  ta->bOwned = FAL
c4c0: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  SE;.    }.    pW
c4d0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c4e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
c4f0: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  /*.** Populate t
c500: 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d  he low-level mem
c510: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
c520: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  unction pointers
c530: 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c   in.** sqlite3Gl
c540: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74  obalConfig.m wit
c550: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  h pointers to th
c560: 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68  e routines in th
c570: 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  is file. The.** 
c580: 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66  arguments specif
c590: 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  y the block of m
c5a0: 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e  emory to manage.
c5b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c5c0: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
c5d0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f  ed by sqlite3_co
c5e0: 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72  nfig(), and ther
c5f0: 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20  efore.** is not 
c600: 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 74  required to be t
c610: 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69 73  hreadsafe (it is
c620: 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   not)..*/.const 
c630: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
c640: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
c650: 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20  etWin32(void){. 
c660: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
c670: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
c680: 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20  s winMemMethods 
c690: 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61  = {.    winMemMa
c6a0: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
c6b0: 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Free,.    winMem
c6c0: 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e  Realloc,.    win
c6d0: 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e  MemSize,.    win
c6e0: 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20  MemRoundup,.    
c6f0: 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20  winMemInit,.    
c700: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a  winMemShutdown,.
c710: 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74      &win_mem_dat
c720: 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20  a.  };.  return 
c730: 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a  &winMemMethods;.
c740: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  }..void sqlite3M
c750: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69  emSetDefault(voi
c760: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  d){.  sqlite3_co
c770: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
c780: 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74  IG_MALLOC, sqlit
c790: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29  e3MemGetWin32())
c7a0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c7b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
c7c0: 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  C */../*.** Conv
c7d0: 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69  ert a UTF-8 stri
c7e0: 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20  ng to Microsoft 
c7f0: 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f  Unicode (UTF-16?
c800: 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  )..**.** Space t
c810: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
c820: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
c830: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
c840: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50  oc..*/.static LP
c850: 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e  WSTR winUtf8ToUn
c860: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
c870: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
c880: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
c890: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
c8a0: 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73  e;..  nChar = os
c8b0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
c8c0: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
c8d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
c8e0: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
c8f0: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
c900: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
c910: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
c920: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
c930: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
c940: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
c950: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
c960: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
c970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c980: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
c990: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
c9a0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
c9b0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
c9c0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
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 6e 43 68 61 72 29            nChar)
c9f0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
ca00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ca10: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
ca20: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
ca30: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
ca40: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
ca50: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
ca60: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
ca70: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
ca80: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
ca90: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
caa0: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
cab0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
cac0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
cad0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
cae0: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c  nUnicodeToUtf8(L
caf0: 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  PCWSTR zWideFile
cb00: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
cb10: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  te;.  char *zFil
cb20: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20  ename;..  nByte 
cb30: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
cb40: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
cb50: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
cb60: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
cb70: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
cb80: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
cb90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
cba0: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
cbb0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
cbc0: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
cbd0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
cbe0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
cbf0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
cc00: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
cc10: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
cc20: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
cc30: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
cc40: 20 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 30 2c 20               0, 
cc60: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
cc70: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
cc80: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
cc90: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
cca0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
ccb0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
ccc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
ccd0: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
cce0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
ccf0: 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74  code, based on t
cd00: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f  he.** current co
cd10: 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20  depage settings 
cd20: 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a  for file apis..*
cd30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
cd40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
cd50: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
cd60: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
cd70: 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  e3_malloc..*/.st
cd80: 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d  atic LPWSTR winM
cd90: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e  bcsToUnicode(con
cda0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
cdb0: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
cdc0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73  ;.  LPWSTR zMbcs
cdd0: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Filename;.  int 
cde0: 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65  codepage = osAre
cdf0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
ce00: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
ce10: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  CP;..  nByte = o
ce20: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
ce30: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
ce40: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
ce50: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   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 30 29 2a 73 69 7a 65 6f 66         0)*sizeof
ce80: 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e  (WCHAR);.  if( n
ce90: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Byte==0 ){.    r
cea0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
ceb0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73  MbcsFilename = s
cec0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
ced0: 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
cee0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  MbcsFilename[0])
cef0: 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46   );.  if( zMbcsF
cf00: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
cf10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cf20: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
cf30: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
cf40: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
cf50: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63  lename, -1, zMbc
cf60: 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  sFilename,.     
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 6e 42 79 74 65             nByte
cf90: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
cfa0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cfb0: 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e  _free(zMbcsFilen
cfc0: 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46  ame);.    zMbcsF
cfd0: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
cfe0: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46  .  return zMbcsF
cff0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
d000: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
d010: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d  oft Unicode to m
d020: 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63  ulti-byte charac
d030: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
d040: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
d050: 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65  's ANSI codepage
d060: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
d070: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
d080: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
d090: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
d0a0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d0b0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
d0c0: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
d0d0: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69  (LPCWSTR zWideFi
d0e0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
d0f0: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
d100: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
d110: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
d120: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
d130: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
d140: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
d150: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d160: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
d170: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
d180: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
d190: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
d1a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d1b0: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
d1c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
d1d0: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
d1e0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
d1f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d200: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
d210: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
d220: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
d230: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
d240: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
d250: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
d280: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
d290: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
d2a0: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
d2b0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
d2c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
d2d0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
d2e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
d2f0: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
d300: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
d310: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
d320: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
d330: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
d340: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
d350: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
d360: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
d370: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
d380: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
d390: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
d3a0: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
d3b0: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
d3c0: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
d3d0: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
d3e0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
d3f0: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
d400: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d410: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
d420: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
d430: 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65  eToUtf8(zTmpWide
d440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
d450: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
d460: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55  eturn zFilenameU
d470: 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tf8;.}../*.** Co
d480: 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d  nvert UTF-8 to m
d490: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
d4a0: 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63  er string.  Spac
d4b0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
d4c0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
d4d0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
d4e0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
d4f0: 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ()..*/.char *sql
d500: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
d510: 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68  to_mbcs(const ch
d520: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
d530: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
d540: 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  eMbcs;.  LPWSTR 
d550: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
d560: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54  pWide = winUtf8T
d570: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
d580: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
d590: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
d5a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
d5b0: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77 69  ilenameMbcs = wi
d5c0: 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a  nUnicodeToMbcs(z
d5d0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
d5e0: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
d5f0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69  e);.  return zFi
d600: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f  lenameMbcs;.}../
d610: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d620: 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74 61  on sets the data
d630: 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74 68   directory or th
d640: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
d650: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a  ctory based on.*
d660: 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 61  * the provided a
d670: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 74  rguments.  The t
d680: 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  ype argument mus
d690: 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72 20  t be 1 in order 
d6a0: 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64 61  to set the.** da
d6b0: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
d6c0: 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  2 in order to se
d6d0: 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  t the temporary 
d6e0: 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65 20  directory.  The 
d6f0: 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65  zValue.** argume
d700: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
d710: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
d720: 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65 74  to use.  The ret
d730: 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  urn value will b
d740: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  e.** SQLITE_OK i
d750: 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
d760: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
d770: 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
d780: 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50 43  (DWORD type, LPC
d790: 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20  WSTR zValue){.  
d7a0: 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74 6f  char **ppDirecto
d7b0: 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ry = 0;.#ifndef 
d7c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d7d0: 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d 20  INIT.  int rc = 
d7e0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
d7f0: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
d800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
d810: 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  if.  if( type==S
d820: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
d830: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20  _DIRECTORY_TYPE 
d840: 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f  ){.    ppDirecto
d850: 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64 61  ry = &sqlite3_da
d860: 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  ta_directory;.  
d870: 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d 3d  }else if( type==
d880: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
d890: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
d8a0: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
d8b0: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 74  ory = &sqlite3_t
d8c0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
d8d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 70   }.  assert( !pp
d8e0: 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79 70  Directory || typ
d8f0: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d900: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
d910: 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  YPE.          ||
d920: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d930: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
d940: 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20 61  RY_TYPE.  );.  a
d950: 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74  ssert( !ppDirect
d960: 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65  ory || sqlite3Me
d970: 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a 70  mdebugHasType(*p
d980: 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54  pDirectory, MEMT
d990: 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20 69  YPE_HEAP) );.  i
d9a0: 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20 29  f( ppDirectory )
d9b0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c  {.    char *zVal
d9c0: 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20 20  ueUtf8 = 0;.    
d9d0: 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56  if( zValue && zV
d9e0: 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  alue[0] ){.     
d9f0: 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77 69   zValueUtf8 = wi
da00: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
da10: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
da20: 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30   ( zValueUtf8==0
da30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
da40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
da50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
da60: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
da70: 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  *ppDirectory);. 
da80: 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20     *ppDirectory 
da90: 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20  = zValueUtf8;.  
daa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dab0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
dac0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
dad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ../*.** The retu
dae0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47  rn value of winG
daf0: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
db00: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
db10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
db20: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
db30: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
db40: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
db50: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
db60: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
db70: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
db80: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f  LastErrorMsg(DWO
db90: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e  RD lastErrno, in
dba0: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
dbb0: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
dbc0: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
dbd0: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
dbe0: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
dbf0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
dc00: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
dc10: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
dc20: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
dc30: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
dc40: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
dc50: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
dc60: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
dc70: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
dc80: 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
dc90: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
dca0: 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52  _WINRT.    WCHAR
dcb0: 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54   zTempWide[SQLIT
dcc0: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
dcd0: 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20  SG_CHARS+1];.   
dce0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
dcf0: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
dd00: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
dd10: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
dd40: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
dd50: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 4e 55 4c 4c 2c 0a 20 20 20 20 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 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
dda0: 20 20 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 30 2c 0a 20 20             0,.  
ddc0: 20 20 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 7a 54 65 6d 70             zTemp
dde0: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
de10: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
de20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
de40: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
de50: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
de60: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
de70: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
de80: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
de90: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
dea0: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
ded0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
dee0: 20 20 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 46 4f 52 4d 41             FORMA
df00: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
df10: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _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 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
df40: 20 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 6c 61 73 74 45 72            lastEr
df60: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 30 2c 0a 20 20 20 20 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 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
dfb0: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 30 2c 0a 20 20 20 20 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 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
e000: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
e010: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
e020: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
e030: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
e040: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
e050: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
e060: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
e070: 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ut = winUnicodeT
e080: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
e090: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e0a0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
e0b0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
e0c0: 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20  _WINRT.      /* 
e0d0: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
e0e0: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
e0f0: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
e100: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
e110: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65  alFree(zTempWide
e120: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
e130: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
e140: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
e150: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
e160: 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b  r *zTemp = NULL;
e170: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
e180: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f  ormatMessageA(FO
e190: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
e1a0: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_BUFFER |. 
e1b0: 20 20 20 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 46 4f 52 4d              FORM
e1d0: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
e1e0: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  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 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
e210: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
e220: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 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 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
e2b0: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &zTemp,.   
e2c0: 20 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 30 2c 0a 20 20 20            0,.   
e2e0: 20 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 30 29 3b 0a 20 20            0);.  
e300: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
e310: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
e320: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
e330: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
e340: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
e350: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
e360: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
e370: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
e380: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
e390: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
e3a0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
e3b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20  loc();.      /* 
e3c0: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
e3d0: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
e3e0: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
e3f0: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
e400: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
e410: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e420: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
e430: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
e440: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
e450: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
e460: 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74  %lx (%lu)", last
e470: 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f  Errno, lastErrno
e480: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e490: 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75  /* copy a maximu
e4a0: 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20  m of nBuf chars 
e4b0: 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  to output buffer
e4c0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
e4d0: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
e4e0: 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  Buf, "%s", zOut)
e4f0: 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68  ;.    /* free th
e500: 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f  e UTF8 buffer */
e510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
e520: 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72  e(zOut);.  }.  r
e530: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e540: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e550: 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  on - winLogError
e560: 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e  AtLine() - is on
e570: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76  ly ever called v
e580: 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20  ia the macro.** 
e590: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  winLogError()..*
e5a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e5b0: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74  e is invoked aft
e5c0: 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  er an error occu
e5d0: 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63  rs in an OS func
e5e0: 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73  tion..** It logs
e5f0: 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67   a message using
e600: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63   sqlite3_log() c
e610: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
e620: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a  rrent value of.*
e630: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  * error code and
e640: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
e650: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
e660: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
e670: 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61  m.** FormatMessa
e680: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
e690: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
e6a0: 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  sed to the macro
e6b0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65   should be the e
e6c0: 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a  rror code that.*
e6d0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  * will be return
e6e0: 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e  ed to SQLite (e.
e6f0: 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  g. SQLITE_IOERR_
e700: 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43  DELETE, SQLITE_C
e710: 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65  ANTOPEN)..** The
e720: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
e730: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
e740: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
e750: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
e760: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61  that.** failed a
e770: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
e780: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
e790: 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  th, if any..*/.#
e7a0: 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72  define winLogErr
e7b0: 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69  or(a,b,c,d)   wi
e7c0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
e7d0: 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f  a,b,c,d,__LINE__
e7e0: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ).static int win
e7f0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
e800: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
e830: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52  r code */.  DWOR
e840: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20  D lastErrno,    
e850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e860: 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20  in32 last error 
e870: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e880: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
e890: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
e8a0: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
e8b0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
e8c0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8e0: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
e8f0: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
e900: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20  */.  int iLine  
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
e930: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
e940: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
e950: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73  */.){.  char zMs
e960: 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20  g[500];         
e970: 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e          /* Human
e980: 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20   readable error 
e990: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  text */.  int i;
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e9c0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e9d0: 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77  zMsg[0] = 0;.  w
e9e0: 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
e9f0: 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a  g(lastErrno, siz
ea00: 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29  eof(zMsg), zMsg)
ea10: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63  ;.  assert( errc
ea20: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
ea30: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30  ;.  if( zPath==0
ea40: 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20   ) zPath = "";. 
ea50: 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69   for(i=0; zMsg[i
ea60: 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ] && zMsg[i]!='\
ea70: 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  r' && zMsg[i]!='
ea80: 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d  \n'; i++){}.  zM
ea90: 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  sg[i] = 0;.  sql
eaa0: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
eab0: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e  ,.      "os_win.
eac0: 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25  c:%d: (%lu) %s(%
ead0: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
eae0: 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f  iLine, lastErrno
eaf0: 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20  , zFunc, zPath, 
eb00: 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74  zMsg.  );..  ret
eb10: 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a  urn errcode;.}..
eb20: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  /*.** The number
eb30: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61   of times that a
eb40: 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69   ReadFile(), Wri
eb50: 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65  teFile(), and De
eb60: 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69  leteFile().** wi
eb70: 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f  ll be retried fo
eb80: 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e  llowing a lockin
eb90: 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62  g error - probab
eba0: 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a 2a 20  ly caused by.** 
ebb0: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
ebc0: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
ebd0: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
ebe0: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
ebf0: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
ec00: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
ec10: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
ec20: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
ec30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
ec40: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
ec50: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
ec60: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
ec70: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
ec80: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
ec90: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
eca0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
ecb0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
ecc0: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74  LAY 25.#endif.st
ecd0: 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72  atic int winIoer
ece0: 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f  rRetry = SQLITE_
ecf0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
ed00: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
ed10: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
ed20: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
ed30: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
ed40: 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77  Y;../*.** The "w
ed50: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
ed60: 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  " macro is used 
ed70: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
ed80: 61 20 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f  a particular I/O
ed90: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  .** error code o
eda0: 62 74 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c  btained via GetL
edb0: 61 73 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c  astError() is el
edc0: 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74  igible to be ret
edd0: 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73  ried.  It.** mus
ede0: 74 20 61 63 63 65 70 74 20 74 68 65 20 65 72 72  t accept the err
edf0: 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73  or code DWORD as
ee00: 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65   its only argume
ee10: 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65  nt and should re
ee20: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
ee30: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
ee40: 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20  de is transient 
ee50: 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68  in nature and th
ee60: 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72  e operation.** r
ee70: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67  esponsible for g
ee80: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72  enerating the or
ee90: 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67  iginal error mig
eea0: 68 74 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20  ht succeed upon 
eeb0: 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64  being.** retried
eec0: 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  .  The argument 
eed0: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68  to this macro sh
eee0: 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69 61 62  ould be a variab
eef0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69  le..**.** Additi
ef00: 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20  onally, a macro 
ef10: 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43  named "winIoerrC
ef20: 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20 62 65  anRetry2" may be
ef30: 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74   defined.  If it
ef40: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
ef50: 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75  it will be consu
ef60: 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74  lted only when t
ef70: 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65  he macro "winIoe
ef80: 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20  rrCanRetry1".** 
ef90: 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54  returns zero.  T
efa0: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
efb0: 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20  etry2" macro is 
efc0: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f  completely optio
efd0: 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62  nal and.** may b
efe0: 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64  e used to includ
eff0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72  e additional err
f000: 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20  or codes in the 
f010: 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  set that should.
f020: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  ** result in the
f030: 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65   failing I/O ope
f040: 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74  ration being ret
f050: 72 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ried by the call
f060: 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e  er.  If.** defin
f070: 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72  ed, the "winIoer
f080: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72  rCanRetry2" macr
f090: 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74 20 65  o must exhibit e
f0a0: 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63  xternal semantic
f0b0: 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74  s.** identical t
f0c0: 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22  o those of the "
f0d0: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
f0e0: 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  1" macro..*/.#if
f0f0: 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65   !defined(winIoe
f100: 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65  rrCanRetry1).#de
f110: 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e  fine winIoerrCan
f120: 52 65 74 72 79 31 28 61 29 20 28 28 28 61 29 3d  Retry1(a) (((a)=
f130: 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45  =ERROR_ACCESS_DE
f140: 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20  NIED)        || 
f150: 5c 0a 20 20 20 20 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: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52  ((a)==ERROR_SHAR
f180: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20  ING_VIOLATION)  
f190: 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20    || \.         
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52       ((a)==ERROR
f1c0: 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29  _LOCK_VIOLATION)
f1d0: 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20         || \.    
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 28 28 61 29 3d 3d            ((a)==
f200: 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58  ERROR_DEV_NOT_EX
f210: 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c  IST)        || \
f220: 0a 20 20 20 20 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 28                 (
f240: 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41  (a)==ERROR_NETNA
f250: 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20  ME_DELETED)     
f260: 20 7c 7c 20 5c 0a 20 20 20 20 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 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f290: 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20  SEM_TIMEOUT)    
f2a0: 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 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 28 28 61 29 3d 3d 45           ((a)==E
f2d0: 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52  RROR_NETWORK_UNR
f2e0: 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69  EACHABLE)).#endi
f2f0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65  f../*.** If a Re
f300: 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74  adFile() or Writ
f310: 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63  eFile() error oc
f320: 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69  curs, invoke thi
f330: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20  s routine.** to 
f340: 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64  see if it should
f350: 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65   be retried.  Re
f360: 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74  turn TRUE to ret
f370: 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ry.  Return FALS
f380: 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20  E.** to give up 
f390: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
f3a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
f3b0: 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a  RetryIoerr(int *
f3c0: 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a  pnRetry, DWORD *
f3d0: 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44  pError){.  DWORD
f3e0: 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72   e = osGetLastEr
f3f0: 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e  ror();.  if( *pn
f400: 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52  Retry>=winIoerrR
f410: 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20  etry ){.    if( 
f420: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
f430: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20  *pError = e;.   
f440: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
f450: 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f  .  }.  if( winIo
f460: 65 72 72 43 61 6e 52 65 74 72 79 31 28 65 29 20  errCanRetry1(e) 
f470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
f480: 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f  in32_sleep(winIo
f490: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
f4a0: 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
f4b0: 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
f4c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
f4d0: 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f  if defined(winIo
f4e0: 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20  errCanRetry2).  
f4f0: 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72  else if( winIoer
f500: 72 43 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b  rCanRetry2(e) ){
f510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  .    sqlite3_win
f520: 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72  32_sleep(winIoer
f530: 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a  rRetryDelay*(1+*
f540: 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b  pnRetry));.    +
f550: 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72  +*pnRetry;.    r
f560: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e  eturn 1;.  }.#en
f570: 64 69 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72  dif.  if( pError
f580: 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20   ){.    *pError 
f590: 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = e;.  }.  retur
f5a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n 0;.}../*.** Lo
f5b0: 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65  g a I/O error re
f5c0: 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a  try episode..*/.
f5d0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c  static void winL
f5e0: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
f5f0: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
f600: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
f610: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
f620: 52 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  R,.      "delaye
f630: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
f640: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
f650: 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72  ",.      winIoer
f660: 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74  rRetryDelay*nRet
f670: 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a  ry*(nRetry+1)/2.
f680: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69      );.  }.}..#i
f690: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
f6a0: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
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 0a 2a 2a 20  ************.** 
f6f0: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
f700: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
f710: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  inCE only..*/.#i
f720: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
f730: 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45  E_MSVC_LOCALTIME
f740: 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45  _API) || !SQLITE
f750: 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f  _MSVC_LOCALTIME_
f760: 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53  API./*.** The MS
f770: 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77  VC CRT on Window
f780: 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76  s CE may not hav
f790: 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
f7a0: 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a  function.  So.**
f7b0: 20 63 72 65 61 74 65 20 61 20 73 75 62 73 74 69   create a substi
f7c0: 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tute..*/.#includ
f7d0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
f7e0: 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
f7f0: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
f800: 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
f810: 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
f820: 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
f830: 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
f840: 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
f850: 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
f860: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
f870: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
f880: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
f890: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
f8a0: 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
f8b0: 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
f8c0: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
f8d0: 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
f8e0: 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69  4 >> 32);.  osFi
f8f0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
f900: 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29  eTime(&uTm,&lTm)
f910: 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
f920: 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c  SystemTime(&lTm,
f930: 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65  &pTm);.  y.tm_ye
f940: 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d  ar = pTm.wYear -
f950: 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f   1900;.  y.tm_mo
f960: 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d  n = pTm.wMonth -
f970: 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20   1;.  y.tm_wday 
f980: 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b  = pTm.wDayOfWeek
f990: 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20  ;.  y.tm_mday = 
f9a0: 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d  pTm.wDay;.  y.tm
f9b0: 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75  _hour = pTm.wHou
f9c0: 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20  r;.  y.tm_min = 
f9d0: 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79  pTm.wMinute;.  y
f9e0: 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53  .tm_sec = pTm.wS
f9f0: 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20  econd;.  return 
fa00: 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  &y;.}.#endif..#d
fa10: 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
fa20: 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
fa30: 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
fa40: 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28  [-(int)offsetof(
fa50: 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
fa60: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
fa70: 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
fa80: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
fa90: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
faa0: 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
fab0: 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
fac0: 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
fad0: 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
fae0: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
faf0: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
fb00: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
fb10: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
fb20: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
fb30: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
fb40: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
fb50: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
fb60: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
fb70: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
fb80: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
fb90: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
fba0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
fbb0: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
fbc0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
fbd0: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
fbe0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
fbf0: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
fc00: 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61  ic int winceCrea
fc10: 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61  teLock(const cha
fc20: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69  r *zFilename, wi
fc30: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
fc40: 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20   LPWSTR zTok;.  
fc50: 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20  LPWSTR zName;.  
fc60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
fc70: 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20  .  BOOL bLogged 
fc80: 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20  = FALSE;.  BOOL 
fc90: 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
fca0: 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38   zName = winUtf8
fcb0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
fcc0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
fcd0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f  e==0 ){.    /* o
fce0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
fcf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fd00: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
fd10: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
fd20: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
fd30: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73  ckdata */.  mems
fd40: 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  et(&pFile->local
fd50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c  , 0, sizeof(pFil
fd60: 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f  e->local));..  /
fd70: 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61  * Replace the ba
fd80: 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74  ckslashes from t
fd90: 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
fda0: 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a  lowercase it.  *
fdb0: 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75  * to derive a mu
fdc0: 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a  tex name. */.  z
fdd0: 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65  Tok = osCharLowe
fde0: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
fdf0: 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
fe00: 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
fe10: 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
fe20: 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
fe30: 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
fe40: 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
fe50: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
fe60: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28   osCreateMutexW(
fe70: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
fe80: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
fe90: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
fea0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
feb0: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
fec0: 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r();.    sqlite3
fed0: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
fee0: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
fef0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
ff00: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
ff10: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
ff30: 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20  ceCreateLock1", 
ff40: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
ff50: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
ff60: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
ff70: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
ff80: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
ff90: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
ffa0: 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65  ..  /* Since the
ffb0: 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20   names of named 
ffc0: 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f  mutexes, semapho
ffd0: 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e  res, file mappin
ffe0: 67 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20  gs etc are.  ** 
fff0: 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20  case-sensitive, 
10000 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
10010 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63  f that by upperc
10020 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20  asing the mutex 
10030 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73  name.  ** and us
10040 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20  ing that as the 
10050 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69  shared filemappi
10060 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ng name..  */.  
10070 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61  osCharUpperW(zNa
10080 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
10090 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65  hared = osCreate
100a0 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56  FileMappingW(INV
100b0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
100c0 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  E, 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 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
10100 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
10110 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
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 7a                 z
10140 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Name);..  /* Set
10150 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64   a flag that ind
10160 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65  icates we're the
10170 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65   first to create
10180 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69   the memory so i
10190 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a  t.  ** must be z
101a0 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
101b0 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  */.  lastErrno =
101c0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
101d0 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72  );.  if (lastErr
101e0 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  no == ERROR_ALRE
101f0 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
10200 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
10210 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
10220 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f  ree(zName);..  /
10230 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65  * If we succeede
10240 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20  d in making the 
10250 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
10260 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f  ndle, map it. */
10270 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
10280 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69  hared ){.    pFi
10290 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69  le->shared = (wi
102a0 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69  nceLock*)osMapVi
102b0 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
102c0 68 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20  hShared,.       
102d0 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52        FILE_MAP_R
102e0 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49  EAD|FILE_MAP_WRI
102f0 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66  TE, 0, 0, sizeof
10300 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
10310 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20    /* If mapping 
10320 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68  failed, close th
10330 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
10340 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65  handle and erase
10350 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21   it */.    if( !
10360 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b  pFile->shared ){
10370 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
10380 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
10390 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
103a0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
103b0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c  LITE_IOERR, pFil
103c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
103f0 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  2", zFilename);.
10400 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20        bLogged = 
10410 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c  TRUE;.      osCl
10420 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
10430 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  >hShared);.     
10440 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
10450 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
10460 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65  }..  /* If share
10470 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e  d memory could n
10480 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74  ot be created, t
10490 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75  hen close the mu
104a0 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a  tex and fail */.
104b0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
104c0 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  ared==NULL ){.  
104d0 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29    if( !bLogged )
104e0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
104f0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
10500 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c  rrno;.      winL
10510 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
10520 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
10530 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
10540 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
10550 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46  CreateLock3", zF
10560 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
10570 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a  bLogged = TRUE;.
10580 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d      }.    winceM
10590 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
105a0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
105b0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
105c0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
105d0 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
105e0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75  = NULL;.    retu
105f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
10600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
10610 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64  alize the shared
10620 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65   memory if we're
10630 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a   supposed to */.
10640 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20    if( bInit ){. 
10650 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d     memset(pFile-
10660 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65  >shared, 0, size
10670 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
10680 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
10690 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
106a0 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
106b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
106c0 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68  /*.** Destroy th
106d0 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c  e part of winFil
106e0 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74  e that deals wit
106f0 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f  h wince locks.*/
10700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
10710 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69  ceDestroyLock(wi
10720 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
10730 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74   if (pFile->hMut
10740 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75  ex){.    /* Acqu
10750 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ire the mutex */
10760 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41  .    winceMutexA
10770 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
10780 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  utex);..    /* T
10790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
107a0 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  cks should proba
107b0 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65  bly assert in de
107c0 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68  bug mode, but th
107d0 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f  ey.       are to
107e0 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65   cleanup in case
107f0 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69   any locks remai
10800 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20  ned open */.    
10810 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10820 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
10830 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10840 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  >nReaders --;.  
10850 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
10860 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
10870 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
10880 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
10890 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
108a0 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
108b0 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
108c0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
108d0 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
108e0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
108f0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10900 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
10910 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
10920 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
10930 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  e = FALSE;.    }
10940 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65  ..    /* De-refe
10950 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20  rence and close 
10960 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20  our copy of the 
10970 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
10980 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e  ndle */.    osUn
10990 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
109a0 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20  ile->shared);.  
109b0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
109c0 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b  pFile->hShared);
109d0 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69  ..    /* Done wi
109e0 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  th the mutex */.
109f0 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
10a00 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
10a10 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  tex);.    osClos
10a20 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
10a30 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
10a40 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
10a50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
10a60 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
10a70 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
10a80 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77  () API of Window
10a90 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74  s for CE.*/.stat
10aa0 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63  ic BOOL winceLoc
10ab0 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
10ac0 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
10ad0 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
10ae0 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
10af0 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
10b00 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
10b10 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
10b20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
10b30 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
10b40 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
10b50 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
10b60 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
10b70 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
10b80 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
10b90 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
10ba0 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
10bb0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10bc0 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
10bd0 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
10be0 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
10bf0 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
10c00 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
10c10 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
10c20 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
10c30 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
10c40 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
10c50 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
10c60 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
10c70 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
10c80 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10c90 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
10ca0 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
10cb0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
10cc0 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
10cd0 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
10ce0 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
10cf0 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
10d00 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10d10 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
10d20 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
10d30 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
10d40 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
10d50 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
10d60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10d70 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
10d80 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
10d90 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
10da0 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
10db0 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
10dc0 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
10dd0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
10de0 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
10df0 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
10e00 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
10e10 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
10e20 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
10e30 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
10e40 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10e50 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
10e60 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10e70 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
10e80 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
10e90 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
10ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
10eb0 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
10ec0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
10ed0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
10ee0 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
10ef0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
10f00 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
10f10 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
10f20 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70  {.    /* If no p
10f30 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
10f40 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74  been acquired, t
10f50 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a  hen acquire it *
10f60 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
10f70 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
10f80 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  g == 0) {.      
10f90 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10fa0 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
10fb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
10fc0 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  al.bPending = TR
10fd0 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
10fe0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
10ff0 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
11000 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20   reserved lock? 
11010 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
11020 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
11030 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
11040 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
11050 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
11060 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
11070 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
11080 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
11090 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ved == 0) {.    
110a0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
110b0 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  >bReserved = TRU
110c0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
110d0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
110e0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
110f0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
11100 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
11110 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
11120 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
11130 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
11140 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
11150 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
11160 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20   UnlockFile API 
11170 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
11180 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
11190 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
111a0 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
111b0 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
111c0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
111d0 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
111e0 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
111f0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11200 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  UnlockLow,.  DWO
11210 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
11220 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b  sToUnlockHigh.){
11230 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11240 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
11250 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
11260 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
11270 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
11280 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
11290 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
112a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
112b0 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
112c0 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  oUnlockHigh);.. 
112d0 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
112e0 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
112f0 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
11300 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
11310 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  tex);..  /* Rele
11320 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c  asing a reader l
11330 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  ock or an exclus
11340 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  ive lock */.  if
11350 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
11360 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
11370 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f  ED_FIRST){.    /
11380 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e  * Did we have an
11390 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
113a0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
113b0 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
113c0 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ive){.      asse
113d0 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
113e0 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
113f0 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
11400 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ZE);.      pFile
11410 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
11420 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
11430 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
11440 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
11450 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
11460 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
11470 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  ..    /* Did we 
11480 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64  just have a read
11490 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  er lock? */.    
114a0 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e  else if (pFile->
114b0 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
114c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
114d0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
114e0 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
114f0 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20  D)SHARED_SIZE.  
11500 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e             || nN
11510 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
11520 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20  lockLow == 1);. 
11530 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
11540 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  l.nReaders --;. 
11550 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
11560 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
11570 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  = 0).      {.   
11580 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11590 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
115a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
115b0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
115c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
115d0 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69  eleasing a pendi
115e0 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ng lock */.  els
115f0 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11600 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11610 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
11620 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
11630 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
11640 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
11650 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11660 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
11670 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
11680 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
11690 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
116a0 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
116b0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
116c0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
116d0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c    }.  }.  /* Rel
116e0 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65  easing a reserve
116f0 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  d lock */.  else
11700 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
11710 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52  tLow == (DWORD)R
11720 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20  ESERVED_BYTE.   
11730 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
11740 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
11750 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
11760 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11770 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20  .bReserved) {.  
11780 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
11790 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  .bReserved = FAL
117a0 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
117b0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
117c0 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
117d0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
117e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
117f0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11800 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11810 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
11820 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  n;.}./*.** End o
11830 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f  f the special co
11840 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a  de for wince.***
11850 2a 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 2f 0a 23 65 6e 64  **********/.#end
118a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
118b0 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WINCE */../*.** 
118c0 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  Lock a file regi
118d0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  on..*/.static BO
118e0 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a  OL winLockFile(.
118f0 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
11900 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73  e,.  DWORD flags
11910 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
11920 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
11930 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
11940 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
11950 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
11960 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
11970 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
11980 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
11990 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
119a0 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
119b0 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
119c0 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
119d0 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69        API LockFi
119e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  le..  */.  retur
119f0 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  n winceLockFile(
11a00 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
11a10 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  w, offsetHigh,. 
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f        numBytesLo
11a40 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
11a50 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73  ;.#else.  if( os
11a60 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  IsNT() ){.    OV
11a70 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
11a80 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
11a90 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
11aa0 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
11ab0 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
11ac0 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
11ad0 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
11ae0 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
11af0 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28  rn osLockFileEx(
11b00 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  *phFile, flags, 
11b10 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
11b20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
11b30 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
11b40 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
11b50 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
11b60 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
11b70 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
11b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11b90 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
11ba0 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
11bb0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  f.}../*.** Unloc
11bc0 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e  k a file region.
11bd0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  . */.static BOOL
11be0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a   winUnlockFile(.
11bf0 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
11c00 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  e,.  DWORD offse
11c10 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66  tLow,.  DWORD of
11c20 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
11c30 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  D numBytesLow,. 
11c40 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48   DWORD numBytesH
11c50 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  igh.){.#if SQLIT
11c60 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a  E_OS_WINCE.  /*.
11c70 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
11c80 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
11c90 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
11ca0 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
11cb0 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a  f the Win32.  **
11cc0 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63         API Unloc
11cd0 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
11ce0 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  turn winceUnlock
11cf0 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
11d00 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
11d10 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
11d30 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
11d40 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20  esHigh);.#else. 
11d50 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
11d60 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
11d70 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
11d80 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
11d90 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
11da0 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
11db0 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
11dc0 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
11dd0 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
11de0 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
11df0 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65  ckFileEx(*phFile
11e00 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
11e10 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
11e20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
11e30 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
11e40 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  lockFile(*phFile
11e50 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
11e60 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
11e70 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
11e90 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
11ea0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a  .#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 0a 2a 2a 20 54 68 65  *********.** The
11f00 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72   next group of r
11f10 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e  outines implemen
11f20 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  t the I/O method
11f30 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  s specified.** b
11f40 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  y the sqlite3_io
11f50 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e  _methods object.
11f60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
11fb0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63  ../*.** Some Mic
11fc0 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73  rosoft compilers
11fd0 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e   lack this defin
11fe0 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ition..*/.#ifnde
11ff0 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  f INVALID_SET_FI
12000 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66  LE_POINTER.# def
12010 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  ine INVALID_SET_
12020 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44  FILE_POINTER ((D
12030 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a  WORD)-1).#endif.
12040 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
12050 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
12060 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
12070 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
12080 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
12090 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f  ent to offset iO
120a0 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65  ffset within the
120b0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
120c0 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  sful, return 0..
120d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
120e0 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
120f0 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
12100 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
12110 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c  c int winSeekFil
12120 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
12130 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
12140 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53  iOffset){.#if !S
12150 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
12160 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b   LONG upperBits;
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32   /* Most sig. 32
12190 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
121a0 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f  set */.  LONG lo
121b0 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  werBits;        
121c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73           /* Leas
121d0 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
121e0 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
121f0 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20    DWORD dwRet;  
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
12220 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
12230 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f  inter() */.  DWO
12240 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12260 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
12270 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
12280 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   */..  OSTRACE((
12290 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "SEEK file=%p, o
122a0 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70  ffset=%lld\n", p
122b0 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74  File->h, iOffset
122c0 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73  ));..  upperBits
122d0 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
122e0 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
122f0 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
12300 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
12310 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
12320 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
12330 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
12340 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
12350 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
12360 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  word.  ** contai
12370 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33  ning the lower 3
12380 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65  2-bits of the ne
12390 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f  w file-offset. O
123a0 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a  r, if it fails,.
123b0 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20    ** it returns 
123c0 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
123d0 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65  _POINTER. Howeve
123e0 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d  r according to M
123f0 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49  SDN,.  ** INVALI
12400 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
12410 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61  ER may also be a
12420 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65   valid new offse
12430 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69  t. So to determi
12440 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  ne.  ** whether 
12450 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74  an error has act
12460 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20  ually occurred, 
12470 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73  it is also neces
12480 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  sary to call.  *
12490 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
124a0 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d  ..  */.  dwRet =
124b0 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
124c0 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
124d0 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
124e0 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
124f0 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49  .  if( (dwRet==I
12500 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
12510 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26  POINTER.      &&
12520 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
12530 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
12540 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a  !=NO_ERROR)) ){.
12550 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
12560 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
12570 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
12580 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
12590 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EEK, pFile->last
125a0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
125b0 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46         "winSeekF
125c0 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ile", pFile->zPa
125d0 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  th);.    OSTRACE
125e0 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
125f0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
12600 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  _SEEK\n", pFile-
12610 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
12620 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41   1;.  }..  OSTRA
12630 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12640 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
12650 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
12660 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
12670 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65  e.  /*.  ** Same
12680 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   as above, excep
12690 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c  t that this impl
126a0 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73  ementation works
126b0 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f   for WinRT..  */
126c0 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45  ..  LARGE_INTEGE
126d0 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  R x;            
126e0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
126f0 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ffset */.  BOOL 
12700 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  bRet;           
12710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
12720 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
12730 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
12740 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50  () */..  x.QuadP
12750 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20  art = iOffset;. 
12760 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c   bRet = osSetFil
12770 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65  ePointerEx(pFile
12780 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f  ->h, x, 0, FILE_
12790 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62  BEGIN);..  if(!b
127a0 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  Ret){.    pFile-
127b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
127c0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
127d0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
127e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
127f0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
12800 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
12810 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65      "winSeekFile
12820 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
12830 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
12840 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
12850 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  =SQLITE_IOERR_SE
12860 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  EK\n", pFile->h)
12870 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
12880 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
12890 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
128a0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
128b0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
128c0 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
128d0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
128e0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
128f0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
12900 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65  ces to VFS helpe
12910 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66  r methods used f
12920 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  or memory mapped
12930 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63   files */.static
12940 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28   int winMapfile(
12950 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65  winFile*, sqlite
12960 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63  3_int64);.static
12970 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c   int winUnmapfil
12980 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e  e(winFile*);.#en
12990 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
129a0 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49   a file..**.** I
129b0 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68  t is reported th
129c0 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  at an attempt to
129d0 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   close a handle 
129e0 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a  might sometimes.
129f0 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69  ** fail.  This i
12a00 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f  s a very unreaso
12a10 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75  nable result, bu
12a20 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74  t Windows is not
12a30 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65  orious.** for be
12a40 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ing unreasonable
12a50 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75   so I do not dou
12a60 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  bt that it might
12a70 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20   happen.  If.** 
12a80 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c  the close fails,
12a90 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30   we pause for 10
12aa0 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
12ab0 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41  nd try again.  A
12ac0 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f  s.** many as MX_
12ad0 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74  CLOSE_ATTEMPT at
12ae0 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20  tempts to close 
12af0 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d  the handle are m
12b00 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69  ade before.** gi
12b10 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75  ving up and retu
12b20 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
12b30 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c  */.#define MX_CL
12b40 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74  OSE_ATTEMPT 3.st
12b50 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73  atic int winClos
12b60 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
12b70 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63  id){.  int rc, c
12b80 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c  nt = 0;.  winFil
12b90 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
12ba0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
12bb0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66  rt( id!=0 );.#if
12bc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12bd0 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70  _WAL.  assert( p
12be0 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  File->pShm==0 );
12bf0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
12c00 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c  ( pFile->h!=NULL
12c10 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e   && pFile->h!=IN
12c20 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
12c30 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  UE );.  OSTRACE(
12c40 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 5c  ("CLOSE file=%p\
12c50 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
12c60 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12c70 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
12c80 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  nUnmapfile(pFile
12c90 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b  );.#endif..  do{
12ca0 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73  .    rc = osClos
12cb0 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
12cc0 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61  );.    /* Simula
12cd0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b  teIOError( rc=0;
12ce0 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54   cnt=MX_CLOSE_AT
12cf0 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d  TEMPT; ); */.  }
12d00 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
12d10 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45  ++cnt < MX_CLOSE
12d20 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c  _ATTEMPT && (sql
12d30 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
12d40 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
12d50 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
12d60 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
12d70 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
12d80 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
12d90 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
12da0 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
12db0 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
12dc0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
12dd0 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
12de0 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65      osDeleteFile
12df0 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
12e00 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
12e10 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65      && osGetFile
12e20 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
12e30 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
12e40 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a 20  e)!=0xffffffff. 
12e50 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20         && cnt++ 
12e60 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e  < WINCE_DELETION
12e70 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b  _ATTEMPTS.    ){
12e80 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
12e90 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29  win32_sleep(100)
12ea0 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74  ;  /* Wait a lit
12eb0 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e  tle before tryin
12ec0 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d  g again */.    }
12ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12ee0 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  e(pFile->zDelete
12ef0 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65  OnClose);.  }.#e
12f00 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b  ndif.  if( rc ){
12f10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
12f20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e  NULL;.  }.  Open
12f30 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f  Counter(-1);.  O
12f40 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66  STRACE(("CLOSE f
12f50 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
12f60 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f  , pFile->h, rc ?
12f70 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
12f80 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  ));.  return rc 
12f90 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ? SQLITE_OK.    
12fa0 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67          : winLog
12fb0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12fc0 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c  RR_CLOSE, osGetL
12fd0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ff0 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22        "winClose"
13000 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
13020 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
13030 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
13040 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
13050 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
13060 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
13070 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
13080 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
13090 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
130a0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
130b0 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c  t winRead(.  sql
130c0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
130d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
130e0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
130f0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13110 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e  Write content in
13120 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
13130 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13150 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13160 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73  s to read */.  s
13170 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
13180 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67  set       /* Beg
13190 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68  in reading at th
131a0 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a  is offset */.){.
131b0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
131c0 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45  INCE.  OVERLAPPE
131d0 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
131e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66         /* The of
131f0 66 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c  fset for ReadFil
13200 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77  e. */.#endif.  w
13210 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
13220 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
13230 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
13240 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13270 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
13280 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
13290 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
132a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
132b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
132c0 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
132d0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
132e0 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
132f0 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
13300 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  t>=0 );.  Simula
13310 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
13320 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
13330 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AD);.  OSTRACE((
13340 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62  "READ file=%p, b
13350 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
13360 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%d, offset=%lld
13370 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
13380 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
13390 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
133a0 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
133b0 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
133c0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
133d0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
133e0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
133f0 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74  his read request
13400 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
13410 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
13420 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
13430 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
13440 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
13450 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
13460 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
13470 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
13480 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
13490 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
134a0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
134b0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
134c0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
134d0 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  t], amt);.      
134e0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d  OSTRACE(("READ-M
134f0 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  MAP file=%p, rc=
13500 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
13510 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
13520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13540 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28     int nCopy = (
13550 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70  int)(pFile->mmap
13560 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a  Size - offset);.
13570 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
13580 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
13590 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
135a0 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
135b0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
135c0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
135d0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
135e0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
135f0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
13600 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13610 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
13620 49 4e 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65  INCE.  if( winSe
13630 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  ekFile(pFile, of
13640 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54  fset) ){.    OST
13650 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65  RACE(("READ file
13660 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46  =%p, rc=SQLITE_F
13670 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ULL\n", pFile->h
13680 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
13690 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
136a0 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64    while( !osRead
136b0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
136c0 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64  Buf, amt, &nRead
136d0 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20  , 0) ){.#else.  
136e0 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
136f0 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
13700 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76  ERLAPPED));.  ov
13710 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
13720 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
13730 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
13740 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
13750 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
13760 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
13770 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68  x7fffffff);.  wh
13780 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65  ile( !osReadFile
13790 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
137a0 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f   amt, &nRead, &o
137b0 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20  verlapped) &&.  
137c0 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
137d0 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48  Error()!=ERROR_H
137e0 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e  ANDLE_EOF ){.#en
137f0 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61  dif.    DWORD la
13800 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  stErrno;.    if(
13810 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
13820 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
13830 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
13840 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13850 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
13860 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
13870 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
13880 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  =SQLITE_IOERR_RE
13890 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  AD\n", pFile->h)
138a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
138b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
138c0 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69  _IOERR_READ, pFi
138d0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c        "winRead",
13900 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
13910 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72    }.  winLogIoer
13920 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28  r(nRetry);.  if(
13930 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d   nRead<(DWORD)am
13940 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65  t ){.    /* Unre
13950 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
13960 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
13970 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
13980 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
13990 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20  *)pBuf)[nRead], 
139a0 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20  0, amt-nRead);. 
139b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
139c0 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
139d0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
139e0 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  _READ\n", pFile-
139f0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13a00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
13a10 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ORT_READ;.  }.. 
13a20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
13a30 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13a40 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
13a50 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
13a60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13a70 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
13a80 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
13a90 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
13aa0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
13ab0 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
13ac0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
13ad0 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
13ae0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57  .static int winW
13af0 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  rite(.  sqlite3_
13b00 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
13b10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
13b20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f  to write into */
13b30 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
13b40 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
13b50 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20     /* The bytes 
13b60 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
13b70 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13ba0 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a  bytes to write *
13bb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
13bc0 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20  4 offset        
13bd0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
13be0 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  to the file to b
13bf0 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20  egin writing at 
13c00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13c10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13c20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13c30 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  if error has occ
13c40 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73  urred, else fals
13c50 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
13c60 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
13c70 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68  *)id;  /* File h
13c80 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
13c90 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
13ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13cb0 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20  mber of retries 
13cc0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d  */..  assert( am
13cd0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
13ce0 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
13cf0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
13d00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
13d10 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61  WRITE);.  Simula
13d20 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
13d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
13d40 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  LL);..  OSTRACE(
13d50 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
13d60 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
13d70 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c  nt=%d, offset=%l
13d80 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
13d90 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
13da0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
13db0 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
13dc0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
13dd0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
13de0 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
13df0 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
13e00 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75   this write requ
13e10 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
13e20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
13e30 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
13e40 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
13e50 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
13e60 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
13e70 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
13e80 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
13e90 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
13ea0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
13eb0 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
13ec0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
13ed0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
13ee0 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20   pBuf, amt);.   
13ef0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
13f00 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c  TE-MMAP file=%p,
13f10 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
13f20 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13f30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13f40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
13f50 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  .      int nCopy
13f60 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e   = (int)(pFile->
13f70 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
13f80 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
13f90 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d  (&((u8 *)(pFile-
13fa0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
13fb0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f  fset], pBuf, nCo
13fc0 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
13fd0 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
13fe0 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
13ff0 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
14000 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
14010 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
14020 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
14030 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d 20  OS_WINCE.  rc = 
14040 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c  winSeekFile(pFil
14050 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  e, offset);.  if
14060 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65  ( rc==0 ){.#else
14070 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  {.#endif.#if 
14080 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
14090 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
140a0 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20  overlapped;     
140b0 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
140c0 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20   for WriteFile. 
140d0 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38  */.#endif.    u8
140e0 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70   *aRem = (u8 *)p
140f0 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  Buf;        /* D
14100 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72  ata yet to be wr
14110 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
14120 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20   nRem = amt;    
14130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14140 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65  mber of bytes ye
14150 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
14160 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72  */.    DWORD nWr
14170 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
14180 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72       /* Bytes wr
14190 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72  itten by each Wr
141a0 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a  iteFile() call *
141b0 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  /.    DWORD last
141c0 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
141d0 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74  ;   /* Value ret
141e0 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74  urned by GetLast
141f0 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20  Error() */..#if 
14200 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
14210 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65  .    memset(&ove
14220 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65  rlapped, 0, size
14230 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
14240 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  .    overlapped.
14250 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
14260 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
14270 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61  fff);.    overla
14280 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
14290 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
142a0 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
142b0 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ff);.#endif..   
142c0 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29   while( nRem>0 )
142d0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
142e0 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28 20  WINCE.      if( 
142f0 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69  !osWriteFile(pFi
14300 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65  le->h, aRem, nRe
14310 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29  m, &nWrite, 0) )
14320 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  {.#else.      if
14330 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
14340 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
14350 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f  Rem, &nWrite, &o
14360 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65  verlapped) ){.#e
14370 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
14380 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
14390 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
143a0 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
143b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
143c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
143d0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c  ert( nWrite==0 |
143e0 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44  | nWrite<=(DWORD
143f0 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69  )nRem );.      i
14400 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  f( nWrite==0 || 
14410 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52  nWrite>(DWORD)nR
14420 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  em ){.        la
14430 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
14440 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
14450 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14460 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   }.#if !SQLITE_O
14470 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66  S_WINCE.      of
14480 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  fset += nWrite;.
14490 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
144a0 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
144b0 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
144c0 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65  ffff);.      ove
144d0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
144e0 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
144f0 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
14500 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  fffff);.#endif. 
14510 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72       aRem += nWr
14520 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20  ite;.      nRem 
14530 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d  -= nWrite;.    }
14540 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20  .    if( nRem>0 
14550 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
14560 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
14570 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
14580 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
14590 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
145a0 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c  if(   ( pFile->l
145b0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
145c0 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c  HANDLE_DISK_FULL
145d0 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70   ).       || ( p
145e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
145f0 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c  =ERROR_DISK_FULL
14600 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41   )){.      OSTRA
14610 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d  CE(("WRITE file=
14620 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
14630 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  LL\n", pFile->h)
14640 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14650 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14660 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e  TE_FULL, pFile->
14670 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c      "winWrite1",
146a0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
146b0 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43      }.    OSTRAC
146c0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
146d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
146e0 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46 69  RR_WRITE\n", pFi
146f0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
14700 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
14710 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
14720 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
14730 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14750 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d  nWrite2", pFile-
14760 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
14770 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72  {.    winLogIoer
14780 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20  r(nRetry);.  }. 
14790 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
147a0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
147b0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
147c0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
147d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
147e0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
147f0 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
14800 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
14810 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54  .static int winT
14820 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
14830 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
14840 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
14850 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14860 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14870 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
14880 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
14890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148b0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20  Return code for 
148c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
148d0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
148e0 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  no;..  assert( p
148f0 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
14900 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
14910 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
14920 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41  UNCATE);.  OSTRA
14930 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69  CE(("TRUNCATE fi
14940 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
14950 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
14960 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14970 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d  h, nByte, pFile-
14980 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20  >locktype));..  
14990 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
149a0 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
149b0 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
149c0 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
149d0 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
149e0 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
149f0 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
14a00 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
14a10 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
14a20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
14a30 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
14a40 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
14a50 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
14a60 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
14a70 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
14a80 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
14a90 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
14aa0 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
14ab0 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
14ac0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
14ad0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
14ae0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
14af0 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
14b00 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
14b10 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
14b20 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
14b30 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65  . */.  if( winSe
14b40 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  ekFile(pFile, nB
14b50 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
14b60 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14b70 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
14b80 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
14b90 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14ba0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
14bb0 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65  runcate1", pFile
14bc0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
14bd0 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e  e if( 0==osSetEn
14be0 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  dOfFile(pFile->h
14bf0 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
14c00 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
14c10 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
14c20 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50  !=ERROR_USER_MAP
14c30 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20  PED_FILE) ){.   
14c40 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14c50 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
14c60 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
14c70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14c80 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
14c90 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cb0 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22    "winTruncate2"
14cc0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
14cd0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
14ce0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
14cf0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
14d00 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  e was truncated 
14d10 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
14d20 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
14d30 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64  ntly.  ** mapped
14d40 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20   region, reduce 
14d50 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61  the effective ma
14d60 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65  pping size as we
14d70 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a  ll. SQLite will.
14d80 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
14d90 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
14da0 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
14db0 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
14dc0 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20  m now on..  */. 
14dd0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70   if( pFile->pMap
14de0 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c  Region && nByte<
14df0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14e00 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  ){.    pFile->mm
14e10 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
14e20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53    }.#endif..  OS
14e30 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
14e40 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
14e50 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
14e60 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
14e70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
14e80 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
14e90 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
14ea0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
14eb0 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
14ec0 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
14ed0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
14ee0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
14ef0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
14f00 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
14f10 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
14f20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
14f30 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
14f40 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
14f50 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
14f60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
14f70 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
14f80 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
14f90 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
14fa0 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  tted to disk..*/
14fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
14fc0 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
14fd0 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
14fe0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14ff0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20  _NO_SYNC.  /*.  
15000 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65  ** Used only whe
15010 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
15020 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
15030 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63  .   */.  BOOL rc
15040 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
15050 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
15060 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15070 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20  _NO_SYNC) || \. 
15080 20 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49     (defined(SQLI
15090 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
150a0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
150b0 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  )).  /*.  ** Use
150c0 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  d when SQLITE_NO
150d0 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
150e0 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20  ined and by the 
150f0 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a  assert() and/or.
15100 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d    ** OSTRACE() m
15110 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77  acros..   */.  w
15120 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
15130 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65  (winFile*)id;.#e
15140 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
15150 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64  AMETER(id);.#end
15160 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
15170 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63  ile );.  /* Chec
15180 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
15190 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
151a0 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
151b0 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
151c0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
151d0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
151e0 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
151f0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
15200 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
15210 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
15220 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
15230 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
15240 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
15250 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
15260 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
15270 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
15280 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
15290 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
152a0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
152b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
152c0 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
152d0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66  OSTRACE(("SYNC f
152e0 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78  ile=%p, flags=%x
152f0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
15300 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15310 68 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d  h, flags, pFile-
15320 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
15330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  fndef SQLITE_TES
15340 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  T.  UNUSED_PARAM
15350 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c  ETER(flags);.#el
15360 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26  se.  if( (flags&
15370 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
15380 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
15390 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
153a0 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
153b0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
153c0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
153d0 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
153e0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
153f0 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
15400 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
15410 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
15420 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
15430 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45  O_SYNC.  OSTRACE
15440 28 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65  (("SYNC-NOP file
15450 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
15460 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
15470 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15480 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63  E_OK;.#else.  rc
15490 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75   = osFlushFileBu
154a0 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b  ffers(pFile->h);
154b0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
154c0 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a  or( rc=FALSE );.
154d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
154e0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66  OSTRACE(("SYNC f
154f0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15500 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
15510 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
15520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
15530 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
15540 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
15550 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
15560 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
15570 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15580 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e  TE_IOERR_FSYNC\n
15590 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
155a0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
155b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
155c0 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d  RR_FSYNC, pFile-
155d0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46     "winSync", pF
15600 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
15610 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
15620 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
15630 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
15640 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
15650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15660 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
15670 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
15680 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  e3_int64 *pSize)
15690 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
156a0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
156b0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
156c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
156d0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
156e0 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20  ssert( pSize!=0 
156f0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
15700 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
15710 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b  TE_IOERR_FSTAT);
15720 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
15730 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
15740 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
15750 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20  , pSize));..#if 
15760 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
15770 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41    {.    FILE_STA
15780 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b  NDARD_INFO info;
15790 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69  .    if( osGetFi
157a0 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
157b0 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68  andleEx(pFile->h
157c0 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e  , FileStandardIn
157d0 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20           &info, 
15800 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b  sizeof(info)) ){
15810 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
15820 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51  info.EndOfFile.Q
15830 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c  uadPart;.    }el
15840 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
15850 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
15860 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
15870 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
15880 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
15890 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
158a0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
158d0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
158e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
158f0 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75  .  {.    DWORD u
15900 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  pperBits;.    DW
15910 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ORD lowerBits;. 
15920 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
15930 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69  no;..    lowerBi
15940 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69  ts = osGetFileSi
15950 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70  ze(pFile->h, &up
15960 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70  perBits);.    *p
15970 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65  Size = (((sqlite
15980 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74  3_int64)upperBit
15990 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42  s)<<32) + lowerB
159a0 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28  its;.    if(   (
159b0 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56  lowerBits == INV
159c0 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a  ALID_FILE_SIZE).
159d0 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74         && ((last
159e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
159f0 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
15a00 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46  ROR) ){.      pF
15a10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
15a20 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
15a30 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
15a40 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
15a50 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
15a60 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
15a90 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
15aa0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
15ab0 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
15ac0 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
15ad0 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20  p, *pSize=%lld, 
15ae0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
15af0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
15b00 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71  Size, *pSize, sq
15b10 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
15b20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
15b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49  .}../*.** LOCKFI
15b40 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15b50 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ELY is undefined
15b60 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73   on some Windows
15b70 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
15b80 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  ndef LOCKFILE_FA
15b90 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23  IL_IMMEDIATELY.#
15ba0 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
15bb0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
15bc0 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  Y 1.#endif..#ifn
15bd0 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  def LOCKFILE_EXC
15be0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65  LUSIVE_LOCK.# de
15bf0 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  fine LOCKFILE_EX
15c00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23  CLUSIVE_LOCK 2.#
15c10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73  endif../*.** His
15c20 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74  torically, SQLit
15c30 65 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20  e has used both 
15c40 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64  the LockFile and
15c50 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
15c60 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74  tions..** When t
15c70 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63  he LockFile func
15c80 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69  tion was used, i
15c90 74 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70  t was always exp
15ca0 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a  ected to fail.**
15cb0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20   immediately if 
15cc0 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  the lock could n
15cd0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20  ot be obtained. 
15ce0 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73   Also, it always
15cf0 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20   expected to.** 
15d00 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
15d10 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65  ive lock.  These
15d20 20 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20   flags are used 
15d30 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  with the LockFil
15d40 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eEx function.** 
15d50 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73  and reflect thos
15d60 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20  e expectations; 
15d70 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20  therefore, they 
15d80 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68  should not be ch
15d90 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  anged..*/.#ifnde
15da0 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  f SQLITE_LOCKFIL
15db0 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  E_FLAGS.# define
15dc0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
15dd0 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49  _FLAGS   (LOCKFI
15de0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15df0 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20  ELY | \.        
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49            LOCKFI
15e20 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
15e30 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  K).#endif../*.**
15e40 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69   Currently, SQLi
15e50 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74  te never calls t
15e60 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  he LockFileEx fu
15e70 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77  nction without w
15e80 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61  anting the.** ca
15e90 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64  ll to fail immed
15ea0 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f  iately if the lo
15eb0 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
15ec0 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ained..*/.#ifnde
15ed0 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  f SQLITE_LOCKFIL
15ee0 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  EEX_FLAGS.# defi
15ef0 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
15f00 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b  LEEX_FLAGS (LOCK
15f10 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
15f20 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f  ATELY).#endif../
15f30 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
15f40 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44  eader lock..** D
15f50 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75  ifferent API rou
15f60 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64  tines are called
15f70 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
15f80 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
15f90 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72  s.** is Win9x or
15fa0 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69   WinNT..*/.stati
15fb0 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64  c int winGetRead
15fc0 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
15fd0 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
15fe0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15ff0 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  D-LOCK file=%p, 
16000 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
16010 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
16020 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f  ktype));.  if( o
16030 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
16040 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
16050 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
16060 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
16070 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
16080 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
16090 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
160a0 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  n32.    **      
160b0 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e   API LockFileEx.
160c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  .    */.    res 
160d0 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  = winceLockFile(
160e0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
160f0 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30  D_FIRST, 0, 1, 0
16100 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73  );.#else.    res
16110 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
16120 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
16130 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
16140 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
16150 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
16160 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
16170 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69  _SIZE, 0);.#endi
16180 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
16190 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
161a0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69  SI.  else{.    i
161b0 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
161c0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
161d0 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
161e0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
161f0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
16200 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
16210 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
16220 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
16230 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
16240 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
16250 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
16260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16270 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
16280 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72  IRST+pFile->shar
16290 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
162a0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
162b0 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20  .  if( res == 0 
162c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
162d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
162e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
162f0 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f  /* No need to lo
16300 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c  g a failure to l
16310 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54  ock */.  }.  OST
16320 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b  RACE(("READ-LOCK
16330 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74   file=%p, result
16340 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
16350 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72  , res));.  retur
16360 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
16370 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a  Undo a readlock.
16380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
16390 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
163a0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
163b0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57  .  int res;.  DW
163c0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
163d0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
163e0 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
163f0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
16400 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
16410 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f  ktype));.  if( o
16420 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72  sIsNT() ){.    r
16430 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
16440 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
16450 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
16460 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
16470 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
16480 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
16490 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73  .  else{.    res
164a0 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
164b0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
164c0 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e  ED_FIRST+pFile->
164d0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
164e0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, 1, 0);.  }.#e
164f0 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d  ndif.  if( res==
16500 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f  0 && ((lastErrno
16510 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16520 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f  r())!=ERROR_NOT_
16530 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70  LOCKED) ){.    p
16540 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
16550 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
16560 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
16570 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
16580 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
16590 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
165a0 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65      "winUnlockRe
165b0 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  adLock", pFile->
165c0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53  zPath);.  }.  OS
165d0 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c  TRACE(("READ-UNL
165e0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
165f0 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ult=%d\n", pFile
16600 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65  ->h, res));.  re
16610 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
16620 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
16630 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
16640 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
16650 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
16660 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
16670 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
16680 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
16690 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
166a0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
166b0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
166c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
166d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
166e0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
166f0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
16700 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
16710 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
16720 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
16730 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
16740 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
16750 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
16760 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
16770 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
16780 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
16790 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
167a0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
167b0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
167c0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
167d0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
167e0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
167f0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
16800 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
16810 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
16820 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
16830 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
16840 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
16850 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
16860 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
16870 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16880 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16890 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
168a0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
168b0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
168c0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
168d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
168e0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
168f0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68  ease a lock.  Th
16900 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f  e winUnlock() ro
16910 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20  utine.** erases 
16920 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63  all locks at onc
16930 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73  e and returns us
16940 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
16950 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
16960 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
16970 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20  ssible to lower 
16980 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16990 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20  l one step at a 
169a0 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75  time.  You.** mu
169b0 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74  st go straight t
169c0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
169d0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
169e0 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33   winLock(sqlite3
169f0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
16a00 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
16a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
16a20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16a30 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  e from subroutin
16a40 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  es */.  int res 
16a50 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
16a60 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69  * Result of a Wi
16a70 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20  ndows lock call 
16a80 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b  */.  int newLock
16a90 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  type;       /* S
16aa0 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  et pFile->lockty
16ab0 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  pe to this value
16ac0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
16ad0 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64  */.  int gotPend
16ae0 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54  ingLock = 0;/* T
16af0 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72  rue if we acquir
16b00 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ed a PENDING loc
16b10 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20  k this time */. 
16b20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
16b30 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
16b40 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
16b50 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20  o = NO_ERROR;.. 
16b60 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
16b70 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
16b80 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c  CK file=%p, oldL
16b90 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c  ock=%d(%d), newL
16ba0 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
16bb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
16bc0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
16bd0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
16be0 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65  ckByte, locktype
16bf0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
16c00 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
16c10 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
16c20 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
16c30 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
16c40 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
16c50 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
16c60 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
16c70 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
16c80 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
16c90 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
16ca0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
16cb0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16cc0 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
16cd0 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
16ce0 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66  CE(("LOCK-HELD f
16cf0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
16d00 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
16d10 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
16d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16d30 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
16d40 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
16d50 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
16d60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
16d70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
16d80 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
16d90 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
16da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
16db0 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
16dc0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16dd0 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
16de0 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
16df0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
16e00 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
16e10 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49  * Lock the PENDI
16e20 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20  NG_LOCK byte if 
16e30 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69  we need to acqui
16e40 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
16e50 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52  k or.  ** a SHAR
16e60 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20  ED lock.  If we 
16e70 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  are acquiring a 
16e80 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
16e90 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a   acquisition of.
16ea0 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47    ** the PENDING
16eb0 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65  _LOCK byte is te
16ec0 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  mporary..  */.  
16ed0 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46  newLocktype = pF
16ee0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
16ef0 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c   if(   (pFile->l
16f00 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
16f10 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c  ).     || (   (l
16f20 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
16f30 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  VE_LOCK).       
16f40 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    && (pFile->loc
16f50 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
16f60 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
16f70 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
16f80 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
16f90 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63  && (res = winLoc
16fa0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16fb0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16fc0 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
17000 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
17010 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
17020 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
17030 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
17040 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  is is needed to 
17050 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72  work.      ** ar
17060 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
17070 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67  used by indexing
17080 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72   and/or anti-vir
17090 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20  us software on. 
170a0 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20       ** Windows 
170b0 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a  systems..      *
170c0 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73 69  * If you are usi
170d0 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73 20  ng this code as 
170e0 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65  a model for alte
170f0 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20 64  rnative VFSes, d
17100 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63  o not.      ** c
17110 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20 6c  opy this retry l
17120 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20 68  ogic.  It is a h
17130 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72  ack intended for
17140 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20   Windows only.. 
17150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61       */.      la
17160 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
17170 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
17180 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
17190 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69  -PENDING-FAIL fi
171a0 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c  le=%p, count=%d,
171b0 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20   result=%d\n",. 
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
171d0 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73  ile->h, cnt, res
171e0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  ));.      if( la
171f0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49  stErrno==ERROR_I
17200 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b  NVALID_HANDLE ){
17210 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
17220 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
17230 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
17240 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
17250 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f  _LOCK;.        O
17260 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41  STRACE(("LOCK-FA
17270 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e  IL file=%p, coun
17280 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  t=%d, rc=%s\n",.
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20   pFile->h, cnt, 
172b0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
172c0 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  c)));.        re
172d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
172e0 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29  .      if( cnt )
172f0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
17300 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
17310 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
17320 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  k = res;.    if(
17330 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c   !res ){.      l
17340 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
17350 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
17360 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
17370 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f  uire a shared lo
17380 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
17390 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
173a0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
173b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
173c0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
173d0 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
173e0 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
173f0 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
17400 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
17410 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
17420 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
17430 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
17440 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
17450 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
17460 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
17470 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
17480 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
17490 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
174a0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
174b0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
174c0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
174d0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
174e0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
174f0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
17500 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
17510 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
17520 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
17530 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
17540 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52  Locktype = RESER
17550 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  VED_LOCK;.    }e
17560 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
17570 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
17580 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
17590 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
175a0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
175b0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
175c0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
175d0 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
175e0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
175f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
17600 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
17610 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
17620 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
17630 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
17640 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
17650 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
17660 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
17670 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
17680 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
17690 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
176a0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
176b0 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20  pFile);.    res 
176c0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
176d0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
176e0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
176f0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
17700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17710 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
17720 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
17730 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
17740 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
17750 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
17760 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
17770 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
17780 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
17790 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
177a0 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
177b0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
177c0 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
177d0 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
177e0 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
177f0 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
17800 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
17810 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
17820 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
17830 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
17840 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17850 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17860 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
17870 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
17880 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
17890 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
178a0 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
178b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
178c0 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
178d0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
178e0 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
178f0 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
17900 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
17910 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
17920 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17930 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
17940 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17950 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  SY;.    OSTRACE(
17960 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
17970 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20  =%p, wanted=%d, 
17980 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  got=%d\n",.     
17990 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
179a0 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c  , locktype, newL
179b0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20  ocktype));.  }. 
179c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
179d0 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
179e0 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
179f0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
17a00 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
17a10 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17a20 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
17a30 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
17a40 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
17a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17a60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17a70 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
17a80 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
17a90 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
17aa0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
17ab0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
17ac0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
17ad0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
17ae0 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
17af0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
17b00 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
17b10 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
17b20 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
17b30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
17b40 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
17b50 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46   int res;.  winF
17b60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
17b70 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
17b80 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
17b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17ba0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
17bb0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41  LOCK; );.  OSTRA
17bc0 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
17bd0 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
17be0 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ut=%p\n", pFile-
17bf0 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  >h, pResOut));..
17c00 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
17c10 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
17c20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
17c30 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
17c40 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  es = 1;.    OSTR
17c50 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
17c60 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
17c70 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22  lt=%d (local)\n"
17c80 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29  , pFile->h, res)
17c90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17ca0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
17cb0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
17cc0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
17cd0 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59  LAGS,RESERVED_BY
17ce0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
17cf0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
17d00 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
17d10 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
17d20 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
17d30 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
17d40 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f  es = !res;.    O
17d50 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
17d60 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
17d70 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65  esult=%d (remote
17d80 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17d90 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  res));.  }.  *pR
17da0 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f  esOut = res;.  O
17db0 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
17dc0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
17dd0 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
17de0 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
17df0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
17e00 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52      pFile->h, pR
17e10 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
17e20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17e30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17e40 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
17e50 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
17e60 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f  descriptor id to
17e70 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
17e80 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
17e90 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
17ea0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
17eb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
17ec0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
17ed0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17ee0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
17ef0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
17f00 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
17f10 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
17f20 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17f30 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
17f40 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
17f50 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61  is routine to fa
17f60 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  il if the second
17f70 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
17f80 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65  NO_LOCK.  If the
17f90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
17fa0 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   is SHARED_LOCK 
17fb0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
17fc0 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  e.** might retur
17fd0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
17fe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17ff0 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nUnlock(sqlite3_
18000 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
18010 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
18020 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ype;.  winFile *
18030 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
18040 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
18050 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
18060 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
18070 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
18080 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
18090 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  K );.  OSTRACE((
180a0 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
180b0 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
180c0 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
180d0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
180e0 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
180f0 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
18100 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
18110 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20  ktype));.  type 
18120 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
18130 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
18140 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
18150 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
18160 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
18170 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
18180 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
18190 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
181a0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
181b0 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b   !winGetReadLock
181c0 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
181d0 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
181e0 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
181f0 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
18200 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
18210 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
18220 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
18230 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
18240 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
18250 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
18260 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c      "winUnlock",
18290 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
182a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
182b0 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
182c0 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
182d0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
182e0 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
182f0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
18300 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
18310 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
18320 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
18330 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  .    winUnlockRe
18340 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
18350 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
18360 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
18370 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
18380 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
18390 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
183a0 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
183b0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
183c0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
183d0 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
183e0 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
183f0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
18400 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
18410 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
18420 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
18430 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
18440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
18450 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  Arg is initially
18460 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
18470 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
18480 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
18490 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
184a0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
184b0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
184c0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
184d0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
184e0 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
184f0 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
18500 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
18510 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
18520 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
18530 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74   void winModeBit
18540 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
18550 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
18560 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
18570 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
18580 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
18590 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
185a0 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
185b0 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
185c0 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
185d0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
185e0 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
185f0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
18600 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
18610 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
18620 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
18630 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75  helper methods u
18640 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  sed for temporar
18650 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69  y files */.stati
18660 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
18670 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
18680 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74   *, char **);.st
18690 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69  atic int winIsDi
186a0 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b  r(const void *);
186b0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
186c0 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
186d0 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72  Colon(const char
186e0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   *);../*.** Cont
186f0 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
18700 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
18710 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
18720 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
18730 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
18740 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
18750 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
18760 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
18770 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53  inFile*)id;.  OS
18780 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18790 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41  le=%p, op=%d, pA
187a0 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  rg=%p\n", pFile-
187b0 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a  >h, op, pArg));.
187c0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
187d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
187e0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
187f0 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
18800 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
18810 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53  cktype;.      OS
18820 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18830 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18840 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18850 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18870 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18880 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
18890 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
188a0 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
188b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
188c0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
188d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
188e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
188f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18900 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18910 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18920 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
18930 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
18940 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
18950 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
18960 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18970 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18980 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18990 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
189a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
189b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
189c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
189d0 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
189e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
189f0 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unk>0 ){.       
18a00 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
18a10 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  ldSz;.        in
18a20 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69  t rc = winFileSi
18a30 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a  ze(id, &oldSz);.
18a40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
18a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
18a70 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73  nt64 newSz = *(s
18a80 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41  qlite3_int64*)pA
18a90 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rg;.          if
18aa0 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b  ( newSz>oldSz ){
18ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
18ac0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18ad0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(1);.         
18ae0 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
18af0 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a  ate(id, newSz);.
18b00 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
18b10 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18b20 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(0);.          
18b30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
18b40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18b50 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18b60 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
18b70 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18b80 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
18b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18ba0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
18bb0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18bc0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18bd0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18be0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18bf0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18c00 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18c10 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
18c20 0a 20 20 20 20 20 20 69 6e 74 20 62 50 65 72 73  .      int bPers
18c30 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72  ist = *(int*)pAr
18c40 67 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 65  g;.      if( bPe
18c50 72 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20  rsist<0 ){.     
18c60 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
18c70 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74   pFile->bPersist
18c80 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Wal;.      }else
18c90 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
18ca0 3e 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20 62  >bPersistWal = b
18cb0 50 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20 20  Persist!=0;.    
18cc0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
18cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18ce0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18cf0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
18d00 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
18d10 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
18d20 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
18d30 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
18d40 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18d50 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18d60 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
18d70 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
18d80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18d90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
18da0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18db0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
18dc0 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
18dd0 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
18de0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
18df0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
18e00 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18e10 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18e20 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18e30 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18e50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18e60 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
18e70 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
18e80 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
18e90 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
18ea0 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
18eb0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54  Name);.      OST
18ec0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18ed0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
18ee0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
18ef0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18f00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18f10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18f20 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
18f30 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69  RETRY: {.      i
18f40 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41  nt *a = (int*)pA
18f50 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  rg;.      if( a[
18f60 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0]>0 ){.        
18f70 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
18f80 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
18f90 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
18fa0 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b  = winIoerrRetry;
18fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18fc0 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
18fd0 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
18fe0 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
18ff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19000 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49       a[1] = winI
19010 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
19020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
19030 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19040 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
19050 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
19060 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
19070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19080 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
19090 54 45 53 54 0a 20 20 20 20 63 61 73 65 20 53 51  TEST.    case SQ
190a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
190b0 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20  _SET_HANDLE: {. 
190c0 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68       LPHANDLE ph
190d0 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45  File = (LPHANDLE
190e0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e  )pArg;.      HAN
190f0 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70  DLE hOldFile = p
19100 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70  File->h;.      p
19110 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c  File->h = *phFil
19120 65 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65  e;.      *phFile
19130 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20   = hOldFile;.   
19140 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
19150 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e  TL oldFile=%p, n
19160 65 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  ewFile=%p, rc=SQ
19170 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
19180 20 20 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46             hOldF
19190 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
191a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
191b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
191c0 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53  endif.    case S
191d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
191e0 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
191f0 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
19200 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   0;.      int rc
19210 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d   = winGetTempnam
19220 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26  e(pFile->pVfs, &
19230 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  zTFile);.      i
19240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19250 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68   ){.        *(ch
19260 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
19270 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
19280 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19290 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
192a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
192b0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
192c0 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
192d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20  n rc;.    }.#if 
192e0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
192f0 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
19300 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
19310 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
19320 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
19330 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
19340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19350 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
19360 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
19370 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
19380 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
19390 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
193a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
193b0 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mmap;.      }.  
193c0 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
193d0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
193e0 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
193f0 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
19400 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
19410 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
19420 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
19430 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
19440 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
19450 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
19460 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
19470 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
19480 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70          winUnmap
19490 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
194a0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d         rc = winM
194b0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
194c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
194d0 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
194e0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
194f0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
19500 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
19510 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
19520 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19530 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
19540 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19550 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
19560 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22  LITE_NOTFOUND\n"
19570 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
19580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
19590 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
195a0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
195b0 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
195c0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
195d0 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
195e0 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
195f0 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
19600 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
19610 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
19620 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
19630 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
19640 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
19650 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
19660 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
19670 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
19680 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
19690 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
196a0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
196b0 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
196c0 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
196d0 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
196e0 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
196f0 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
19700 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19710 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
19720 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
19730 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
19740 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
19750 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69   *id){.  (void)i
19760 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
19770 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
19780 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
19790 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72   Return a vector
197a0 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61   of device chara
197b0 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73  cteristics..*/.s
197c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76  tatic int winDev
197d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
197e0 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
197f0 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  *id){.  winFile 
19800 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  *p = (winFile*)i
19810 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
19820 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
19830 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c  ABLE_WHEN_OPEN |
19840 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63  .         ((p->c
19850 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
19860 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f  LE_PSOW)?SQLITE_
19870 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
19880 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a  OVERWRITE:0);.}.
19890 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  ./*.** Windows w
198a0 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
198b0 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
198c0 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
198d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
198e0 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
198f0 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
19900 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
19910 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
19920 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
19930 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
19940 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
19950 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e  static SYSTEM_IN
19960 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
19970 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19980 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
19990 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
199a0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
199b0 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
199c0 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
199d0 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
199e0 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
199f0 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
19a00 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
19a10 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20  y.** this file, 
19a20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
19a30 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
19a40 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
19a50 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
19a60 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
19a70 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
19a80 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
19a90 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73  obal mutex.** is
19aa0 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
19ab0 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
19ac0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
19ad0 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
19ae0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
19af0 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
19b00 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
19b10 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
19b20 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
19b30 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
19b40 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
19b50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
19b60 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
19b70 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
19b80 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
19b90 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
19ba0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19bb0 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
19bc0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
19bd0 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
19be0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
19bf0 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
19c00 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
19c10 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
19c20 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 6e 64 65  STER));.}.#ifnde
19c30 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
19c40 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
19c50 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
19c60 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
19c70 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
19c80 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
19c90 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
19ca0 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
19cb0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
19cc0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
19cd0 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
19ce0 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
19cf0 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
19d00 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
19d10 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
19d20 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
19d30 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
19d40 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
19d50 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
19d60 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
19d70 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
19d80 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
19d90 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
19da0 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
19db0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19dc0 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
19dd0 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
19de0 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
19df0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
19e00 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
19e10 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
19e20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
19e30 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
19e40 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
19e50 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
19e60 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
19e70 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
19e80 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
19e90 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pNext.**.** The 
19ea0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
19eb0 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
19ec0 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
19ed0 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  is created:.**.*
19ee0 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
19ef0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
19f00 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
19f10 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
19f20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
19f30 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
19f40 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
19f50 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
19f60 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
19f70 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
19f80 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
19f90 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
19fa0 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
19fb0 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
19fc0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
19fd0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
19fe0 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
19ff0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
1a000 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
1a010 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1a020 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
1a030 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
1a040 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
1a050 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
1a060 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
1a070 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1a080 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
1a090 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1a0a0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
1a0b0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1a0c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a0d0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
1a0e0 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
1a0f0 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
1a100 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
1a110 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
1a120 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
1a130 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
1a140 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
1a150 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
1a160 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
1a170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1a180 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1a190 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1a1a0 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
1a1b0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1a1c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a1d0 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
1a1e0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
1a1f0 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
1a200 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
1a210 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
1a220 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
1a230 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
1a240 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
1a250 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
1a260 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
1a270 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1a280 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  cts */.#ifdef SQ
1a290 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
1a2a0 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
1a2b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1a2c0 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d  available winShm
1a2d0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
1a2e0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
1a2f0 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20  global array of 
1a300 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
1a310 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  bjects..**.** Th
1a320 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  e winShmMutexHel
1a330 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
1a340 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1a350 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c  r writing this l
1a360 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77  ist..*/.static w
1a370 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68  inShmNode *winSh
1a380 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  mNodeList = 0;..
1a390 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
1a3a0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
1a3b0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
1a3c0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
1a3d0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
1a3e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
1a3f0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
1a400 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
1a410 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
1a420 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
1a430 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
1a440 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
1a450 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
1a460 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  **.**    winShm.
1a470 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77  pShmNode.**    w
1a480 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  inShm.id.**.** A
1a490 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
1a4a0 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
1a4b0 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d   The winShm.pShm
1a4c0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  Node->mutex must
1a4d0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
1a4e0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
1a4f0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
1a500 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  s..*/.struct win
1a510 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  Shm {.  winShmNo
1a520 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
1a530 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1a540 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ying winShmNode 
1a550 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53  object */.  winS
1a560 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
1a570 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77         /* Next w
1a580 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  inShm with the s
1a590 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ame winShmNode *
1a5a0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a5c0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
1a5d0 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  g the winShmNode
1a5e0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
1a5f0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1a600 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1a610 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1a620 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
1a630 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1a640 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1a650 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1a660 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
1a670 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
1a680 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
1a690 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
1a6a0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1a6b0 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d   with its winShm
1a6c0 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  Node */.#endif.}
1a6d0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
1a6e0 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
1a6f0 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing.*/.#define W
1a700 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IN_SHM_BASE   ((
1a710 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
1a720 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f  OCK)*4)        /
1a730 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1a740 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
1a750 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e  _SHM_DMS    (WIN
1a760 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
1a770 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
1a780 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
1a790 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  /../*.** Apply a
1a7a0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
1a7b0 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65  r all n bytes be
1a7c0 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e  ginning at ofst.
1a7d0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d  .*/.#define _SHM
1a7e0 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
1a7f0 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a  e _SHM_RDLCK  2.
1a800 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c  #define _SHM_WRL
1a810 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74  CK  3.static int
1a820 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1a830 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  k(.  winShmNode 
1a840 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70  *pFile,    /* Ap
1a850 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
1a860 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
1a870 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
1a880 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
1a890 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f          /* _SHM_
1a8a0 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43  UNLCK, _SHM_RDLC
1a8b0 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b  K, or _SHM_WRLCK
1a8c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a8e0 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
1a8f0 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
1a900 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  /unlocked */.  i
1a910 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
1a920 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a930 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
1a940 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
1a950 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1a960 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1a970 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
1a980 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
1a990 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
1a9a0 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
1a9b0 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
1a9c0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
1a9d0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
1a9e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a9f0 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
1aa00 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
1aa10 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  f==0 );..  OSTRA
1aa20 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
1aa30 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
1aa40 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d  offset=%d, size=
1aa50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1aa60 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
1aa70 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74  , lockType, ofst
1aa80 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a  , nByte));..  /*
1aa90 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
1aaa0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
1aab0 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
1aac0 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
1aad0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
1aae0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
1aaf0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1ab00 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
1ab10 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1ab20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1ab30 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
1ab40 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
1ab50 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
1ab60 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
1ab70 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
1ab80 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
1ab90 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
1aba0 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
1abb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
1abc0 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
1abd0 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
1abe0 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
1abf0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
1ac00 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20    }..  if( rc!= 
1ac10 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1ac20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1ac30 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1ac40 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c  tErrno =  osGetL
1ac50 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1ac60 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ac70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
1ac80 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65  (("SHM-LOCK file
1ac90 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72  =%p, func=%s, er
1aca0 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e  rno=%lu, rc=%s\n
1acb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
1acc0 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c  ile->hFile.h, (l
1acd0 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
1ace0 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c  UNLCK) ? "winUnl
1acf0 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20  ockFile" :.     
1ad00 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69        "winLockFi
1ad10 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  le", pFile->last
1ad20 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72  Errno, sqlite3Er
1ad30 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20  rName(rc)));..  
1ad40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ad50 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1ad60 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f  ces to VFS metho
1ad70 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds */.static int
1ad80 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33   winOpen(sqlite3
1ad90 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72  _vfs*,const char
1ada0 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  *,sqlite3_file*,
1adb0 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69  int,int*);.stati
1adc0 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
1add0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f  sqlite3_vfs *,co
1ade0 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
1adf0 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1ae00 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1ae10 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
1ae20 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e  ies with winShmN
1ae30 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
1ae40 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
1ae50 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1ae60 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
1ae70 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
1ae80 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
1ae90 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1aea0 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
1aeb0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1aec0 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76  mPurge(sqlite3_v
1aed0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65  fs *pVfs, int de
1aee0 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e  leteFlag){.  win
1aef0 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20  ShmNode **pp;.  
1af00 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20  winShmNode *p;. 
1af10 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
1af20 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1af30 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1af40 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c  RGE pid=%lu, del
1af50 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20  eteFlag=%d\n",. 
1af60 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1af70 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1af80 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b  ), deleteFlag));
1af90 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
1afa0 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
1afb0 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
1afc0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
1afd0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
1afe0 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
1aff0 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74  ->mutex ){ sqlit
1b000 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1b010 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20  >mutex); }.     
1b020 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1b030 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
1b040 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d        BOOL bRc =
1b050 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
1b060 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
1b070 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
1b080 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1b090 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c  RGE-UNMAP pid=%l
1b0a0 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
1b0b0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1b0c0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1b0d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1b0e0 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
1b0f0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1b100 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52        UNUSED_VAR
1b110 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29  IABLE_VALUE(bRc)
1b120 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  ;.        bRc = 
1b130 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d  osCloseHandle(p-
1b140 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70  >aRegion[i].hMap
1b150 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
1b160 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43  CE(("SHM-PURGE-C
1b170 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  LOSE pid=%lu, re
1b180 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  gion=%d, rc=%s\n
1b190 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b1a0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1b1b0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20  ProcessId(), i, 
1b1c0 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
1b1d0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
1b1e0 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45   UNUSED_VARIABLE
1b1f0 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20  _VALUE(bRc);.   
1b200 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1b210 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20  ->hFile.h!=NULL 
1b220 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49  && p->hFile.h!=I
1b230 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1b240 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53  LUE ){.        S
1b250 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b260 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1b270 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74   winClose((sqlit
1b280 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46  e3_file *)&p->hF
1b290 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69  ile);.        Si
1b2a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b2b0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1b2c0 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
1b2d0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1b2e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b2f0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1b300 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1b310 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1b320 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28        winDelete(
1b330 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
1b340 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
1b350 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
1b360 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1b370 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b380 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1b390 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
1b3a0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
1b3b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1b3c0 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  aRegion);.      
1b3d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1b3e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b3f0 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
1b400 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1b410 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
1b420 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1b430 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1b440 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1b450 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
1b460 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
1b470 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1b480 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
1b490 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
1b4a0 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
1b4b0 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
1b4c0 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
1b4d0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
1b4e0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
1b4f0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
1b500 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
1b510 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
1b520 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
1b530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b540 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1b550 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
1b560 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
1b570 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1b580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b590 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1b5a0 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1b5b0 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
1b5c0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
1b5d0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1b5e0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
1b5f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b620 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75  t code */.  stru
1b630 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
1b640 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1b650 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
1b660 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  d winShmNode */.
1b670 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b6a0 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
1b6b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
1b6c0 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20  Fd->pShm==0 );  
1b6d0 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75    /* Not previou
1b6e0 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20  sly opened */.. 
1b6f0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
1b700 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ce for the new s
1b710 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63  qlite3_shm objec
1b720 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61  t.  Also specula
1b730 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  tively.  ** allo
1b740 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
1b750 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20   new winShmNode 
1b760 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  and filename..  
1b770 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
1b780 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1b790 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
1b7a0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1b7b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1b7c0 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  nName = sqli
1b7d0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46  te3Strlen30(pDbF
1b7e0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65  d->zPath);.  pNe
1b7f0 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  w = sqlite3Mallo
1b800 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
1b810 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65  ShmNode) + nName
1b820 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70   + 17 );.  if( p
1b830 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
1b840 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1b850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b860 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1b870 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  }.  pNew->zFilen
1b880 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
1b890 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ew[1];.  sqlite3
1b8a0 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b  _snprintf(nName+
1b8b0 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  15, pNew->zFilen
1b8c0 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70  ame, "%s-shm", p
1b8d0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1b8e0 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
1b8f0 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
1b900 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b910 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f  );..  /* Look to
1b920 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
1b930 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e   an existing win
1b940 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e  ShmNode that can
1b950 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49   be used..  ** I
1b960 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69  f no matching wi
1b970 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74  nShmNode current
1b980 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74  ly exists, creat
1b990 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
1b9a0 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1b9b0 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53  utex();.  for(pS
1b9c0 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e  hmNode = winShmN
1b9d0 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64  odeList; pShmNod
1b9e0 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d  e; pShmNode=pShm
1b9f0 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Node->pNext){.  
1ba00 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f    /* TBD need to
1ba10 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65   come up with be
1ba20 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e  tter match here.
1ba30 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a    Perhaps.    **
1ba40 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54   use FILE_ID_BOT
1ba50 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63  H_DIR_INFO Struc
1ba60 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
1ba70 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1ba80 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  Cmp(pShmNode->zF
1ba90 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  ilename, pNew->z
1baa0 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62  Filename)==0 ) b
1bab0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1bac0 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20  pShmNode ){.    
1bad0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1bae0 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  w);.  }else{.   
1baf0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77   pShmNode = pNew
1bb00 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1bb10 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28      ((winFile*)(
1bb20 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1bb30 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  ))->h = INVALID_
1bb40 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20  HANDLE_VALUE;.  
1bb50 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78    pShmNode->pNex
1bb60 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  t = winShmNodeLi
1bb70 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f  st;.    winShmNo
1bb80 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64  deList = pShmNod
1bb90 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  e;..    pShmNode
1bba0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1bbb0 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1bbc0 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1bbd0 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1bbe0 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1bbf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bc00 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1bc10 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1bc20 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
1bc30 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28     rc = winOpen(
1bc40 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20  pDbFd->pVfs,.   
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
1bc60 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1bc70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
1bc80 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1bc90 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bcb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
1bcc0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1bcd0 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
1bce0 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  here */.        
1bcf0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1bd00 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54  OPEN_WAL | SQLIT
1bd10 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1bd20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1bd30 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20  REATE,.         
1bd40 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
1bd50 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1bd60 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
1bd70 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1bd80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
1bd90 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
1bda0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
1bdb0 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
1bdc0 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
1bdd0 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63  ** If not, trunc
1bde0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
1bdf0 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20  zero length..   
1be00 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
1be10 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1be20 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
1be30 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1be40 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1be50 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
1be60 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
1be70 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1be80 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
1be90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1beb0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1bec0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1bed0 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
1bee0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c     "winOpenShm",
1bf10 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1bf20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bf30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
1bf50 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1bf60 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1bf70 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1bf80 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
1bf90 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1bfa0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1bfb0 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
1bfc0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
1bfd0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1bfe0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1bff0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
1c000 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
1c010 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
1c020 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
1c030 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
1c040 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
1c050 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
1c060 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
1c070 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
1c080 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
1c090 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
1c0a0 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
1c0b0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1c0c0 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
1c0d0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
1c0e0 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
1c0f0 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
1c100 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
1c110 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
1c120 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1c130 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
1c140 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
1c150 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
1c160 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
1c170 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
1c180 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
1c190 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
1c1a0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
1c1b0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
1c1c0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
1c1d0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
1c1e0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
1c1f0 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
1c200 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
1c210 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
1c220 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1c230 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1c240 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1c250 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1c260 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1c270 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1c280 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1c290 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1c2a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c2b0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1c2c0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1c2d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1c2e0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1c2f0 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1c300 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
1c310 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1c320 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1c330 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1c340 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
1c350 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1c360 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
1c370 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1c380 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1c390 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1c3a0 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
1c3b0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
1c3c0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1c3d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c3e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1c3f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
1c400 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
1c410 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
1c420 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ying.** storage 
1c430 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
1c440 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1c450 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
1c460 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1c470 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1c480 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1c490 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1c4a0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
1c4b0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
1c4c0 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
1c4d0 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
1c4e0 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1c4f0 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
1c500 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1c510 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1c520 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
1c530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c540 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1c550 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
1c560 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1c570 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
1c580 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
1c590 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1c5a0 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
1c5b0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1c5c0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1c5d0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1c5e0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
1c5f0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
1c600 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
1c610 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1c620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
1c630 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1c640 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
1c650 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1c660 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1c670 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1c680 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1c690 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1c6a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c6b0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1c6c0 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1c6d0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1c6e0 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1c6f0 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1c700 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1c710 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1c720 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1c730 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1c740 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1c750 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1c760 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1c770 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c780 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1c790 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1c7a0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1c7b0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1c7c0 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1c7d0 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1c7e0 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1c7f0 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1c800 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1c810 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1c820 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1c830 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1c840 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
1c850 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1c860 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
1c870 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
1c880 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
1c890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c8a0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1c8b0 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1c8c0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1c8d0 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
1c8e0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
1c8f0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
1c900 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1c910 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1c920 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1c930 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1c940 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1c950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c960 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
1c970 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1c980 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c9a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
1c9b0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
1c9c0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1c9d0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1c9e0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
1c9f0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
1ca00 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
1ca10 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1ca20 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
1ca30 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1ca40 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1ca50 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1ca60 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1ca70 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1ca80 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
1ca90 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
1caa0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
1cab0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cad0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1cae0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
1caf0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1cb00 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1cb10 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1cb20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1cb50 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1cb80 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
1cb90 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
1cba0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
1cbb0 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
1cbc0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1cbd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
1cbe0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
1cbf0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1cc00 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1cc10 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1cc20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1cc30 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1cc40 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1cc50 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
1cc60 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1cc70 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1cc80 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1cc90 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1cca0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1ccb0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1ccc0 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
1ccd0 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1cce0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1ccf0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
1cd00 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
1cd10 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
1cd20 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
1cd30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
1cd40 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
1cd50 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
1cd60 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1cd70 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1cd80 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1cd90 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
1cda0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
1cdb0 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
1cdc0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1cdd0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
1cde0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
1cdf0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
1ce00 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
1ce10 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1ce20 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1ce30 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1ce40 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
1ce50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1ce60 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
1ce70 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
1ce80 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
1ce90 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
1cea0 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
1ceb0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1cec0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
1ced0 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
1cee0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
1cef0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
1cf00 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1cf10 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1cf20 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1cf30 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
1cf40 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1cf50 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
1cf60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cf70 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
1cf80 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
1cf90 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1cfa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cfb0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
1cfc0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1cfd0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1cfe0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1cff0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1d000 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1d010 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
1d020 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
1d030 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
1d040 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
1d050 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
1d060 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
1d070 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
1d080 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
1d090 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
1d0a0 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
1d0b0 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
1d0c0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
1d0d0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
1d0e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
1d0f0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
1d100 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
1d110 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
1d120 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1d130 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1d140 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1d150 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
1d160 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
1d170 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1d180 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1d190 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
1d1b0 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
1d1c0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
1d1d0 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
1d1e0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
1d1f0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
1d200 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1d210 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1d230 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
1d240 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1d250 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1d260 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1d270 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66  , _SHM_RDLCK, of
1d280 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1d290 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
1d2a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1d2b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1d2c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d2d0 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
1d2e0 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
1d2f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1d310 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1d320 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1d330 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
1d340 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
1d350 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
1d360 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
1d370 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
1d380 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
1d390 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
1d3a0 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
1d3b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1d3c0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1d3d0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1d3e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1d3f0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1d400 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
1d410 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
1d420 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1d430 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d440 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1d450 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1d460 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1d470 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
1d480 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
1d490 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
1d4a0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
1d4b0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
1d4c0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
1d4d0 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
1d4e0 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
1d4f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d500 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d510 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1d520 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1d530 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  WRLCK, ofst+WIN_
1d540 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1d550 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d570 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
1d580 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
1d590 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
1d5a0 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
1d5b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1d5c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1d5d0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1d5e0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
1d5f0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1d600 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64  K pid=%lu, id=%d
1d610 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33  , sharedMask=%03
1d620 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78  x, exclMask=%03x
1d630 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1d640 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1d650 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1d660 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64  p->id, p->shared
1d670 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
1d680 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  k,.           sq
1d690 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1d6a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1d6b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1d6c0 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
1d6d0 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
1d6e0 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
1d6f0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  emory..**.** All
1d700 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
1d710 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
1d720 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
1d730 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
1d740 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
1d750 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
1d760 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
1d770 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1d780 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
1d790 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
1d7a0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1d7b0 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
1d7c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1d7d0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
1d7e0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a  AMETER(fd);.  /*
1d7f0 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29   MemoryBarrier()
1d800 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f  ; // does not wo
1d810 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f  rk -- do not kno
1d820 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77  w why not */.  w
1d830 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1d840 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
1d850 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
1d860 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d870 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
1d880 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
1d890 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20   region iRegion 
1d8a0 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64  of the.** shared
1d8b0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
1d8c0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1d8d0 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
1d8e0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1d8f0 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ons.** are numbe
1d900 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1d910 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1d920 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1d930 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a  n is szRegion.**
1d940 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1d950 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1d960 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1d970 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1d980 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
1d990 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1d9a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1d9b0 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61  the isWrite para
1d9c0 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
1d9d0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1d9e0 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
1d9f0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
1da00 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
1da10 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
1da20 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
1da30 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
1da40 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
1da50 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
1da60 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1da70 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  OK returned. If.
1da80 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  ** isWrite is no
1da90 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
1daa0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
1dab0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1dac0 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65  s not yet.** bee
1dad0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1dae0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
1daf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1db00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
1db10 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1db20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1db30 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
1db40 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
1db50 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
1db60 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
1db70 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
1db80 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
1db90 65 73 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73  esses.** address
1dba0 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
1dbb0 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
1dbc0 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
1dbd0 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
1dbe0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
1dbf0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1dc00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1dc10 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71   winShmMap(.  sq
1dc20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc40 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
1dc50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1dc60 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc80 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
1dc90 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
1dca0 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dcc0 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
1dcd0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74   */.  int isWrit
1dce0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1dcf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1dd00 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
1dd10 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
1dd20 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
1dd30 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1dd40 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
1dd50 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  mory */.){.  win
1dd60 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1dd70 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69  inFile*)fd;.  wi
1dd80 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
1dd90 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
1dda0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
1ddb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ddc0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29  _OK;..  if( !p )
1ddd0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
1dde0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1ddf0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1de00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1de10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20  eturn rc;.    p 
1de20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1de30 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20   }.  pShmNode = 
1de40 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
1de50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1de60 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1de70 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1de80 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
1de90 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
1dea0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1deb0 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
1dec0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1ded0 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
1dee0 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
1def0 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20  n *apNew;       
1df00 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69      /* New aRegi
1df10 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
1df20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
1df30 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
1df40 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
1df50 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
1df60 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
1df70 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20  3_int64 sz;     
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df90 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
1dfa0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a  wal-index file *
1dfb0 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
1dfc0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
1dfd0 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
1dfe0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1dff0 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
1e000 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1e010 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
1e020 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
1e030 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
1e040 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1e050 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
1e060 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
1e070 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
1e080 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
1e090 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
1e0a0 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
1e0b0 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1e0c0 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1e0d0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1e0e0 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
1e0f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e100 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1e110 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1e120 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1e130 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1e140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e150 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1e160 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map1", pDbFd->zP
1e170 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ath);.      goto
1e180 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1e190 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
1e1a0 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
1e1b0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1e1c0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
1e1d0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
1e1e0 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
1e1f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
1e200 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
1e210 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
1e220 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1e230 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
1e240 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1e250 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
1e260 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
1e270 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
1e280 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
1e290 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
1e2a0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1e2b0 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
1e2c0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
1e2d0 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
1e2e0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
1e2f0 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
1e300 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1e310 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1e320 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1e330 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e340 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1e350 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1e360 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1e370 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1e380 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1e3a0 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62  winShmMap2", pDb
1e3b0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1e3c0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1e3d0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1e3e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
1e3f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1e400 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
1e410 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1e420 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
1e430 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73  /.    apNew = (s
1e440 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1e450 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1e460 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1e470 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
1e480 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
1e490 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
1e4a0 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
1e4b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e4c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1e4d0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1e4e0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1e4f0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
1e500 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1e510 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
1e520 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1e530 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
1e540 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1e550 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
1e560 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
1e570 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
1e580 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
1e590 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
1e5a0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1e5b0 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
1e5c0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d  S_WINRT.      hM
1e5d0 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1e5e0 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1e5f0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1e600 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1e610 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1e620 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  E, nByte, NULL. 
1e630 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1e640 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1e650 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1e660 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1e670 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1e680 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1e690 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1e6a0 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1e6b0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1e6c0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1e6d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1e6e0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
1e6f0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1e700 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1e710 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1e720 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1e730 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1e740 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1e750 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
1e760 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1e770 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
1e780 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1e790 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
1e7a0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1e7b0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e7c0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e7d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1e7e0 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
1e7f0 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
1e800 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1e810 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
1e820 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
1e830 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
1e840 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
1e850 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
1e860 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1e870 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1e880 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1e890 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1e8a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1e8b0 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
1e8c0 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1e8d0 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
1e8e0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1e8f0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1e900 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
1e910 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1e920 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1e930 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1e940 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
1e950 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
1e960 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
1e970 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
1e980 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
1e990 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
1e9a0 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
1e9b0 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1e9c0 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1e9d0 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  t.        );.#en
1e9e0 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52  dif.        OSTR
1e9f0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41  ACE(("SHM-MAP-MA
1ea00 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1ea10 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  n=%d, offset=%d,
1ea20 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1ea30 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1ea40 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ea50 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1ea60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1ea70 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
1ea80 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
1ea90 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
1eaa0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1eab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1eac0 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
1ead0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
1eae0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1eaf0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1eb00 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1eb10 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1eb20 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
1eb30 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1eb60 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  3", pDbFd->zPath
1eb70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68  );.        if( h
1eb80 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e  Map ) osCloseHan
1eb90 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20  dle(hMap);.     
1eba0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1ebb0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1ebc0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1ebd0 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
1ebe0 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20  nRegion].pMap = 
1ebf0 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMap;.      pShm
1ec00 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
1ec10 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
1ec20 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  .hMap = hMap;.  
1ec30 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
1ec40 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
1ec50 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
1ec60 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1ec70 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
1ec80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
1ec90 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a  set = iRegion*sz
1eca0 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  Region;.    int 
1ecb0 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1ecc0 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1ecd0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1ece0 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20  Granularity;.   
1ecf0 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
1ed00 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65   *)pShmNode->aRe
1ed10 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d  gion[iRegion].pM
1ed20 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76  ap;.    *pp = (v
1ed30 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74  oid *)&p[iOffset
1ed40 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  Shift];.  }else{
1ed50 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
1ed60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1ed70 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1ed80 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1ed90 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  rn rc;.}..#else.
1eda0 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d  # define winShmM
1edb0 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
1edc0 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20  e winShmLock    
1edd0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1ede0 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
1edf0 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20  ine winShmUnmap 
1ee00 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
1ee10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ee20 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
1ee30 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61  Cleans up the ma
1ee40 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74  pped region of t
1ee50 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1ee60 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69  e, if any..*/.#i
1ee70 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1ee80 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
1ee90 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
1eea0 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
1eeb0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
1eec0 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
1eed0 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1eee0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1eef0 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52  , hMap=%p, pMapR
1ef00 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
1ef10 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65         "mmapSize
1ef20 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41  =%lld, mmapSizeA
1ef30 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70  ctual=%lld, mmap
1ef40 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c  SizeMax=%lld\n",
1ef50 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1ef60 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ef70 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1ef80 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e  e->hMap, pFile->
1ef90 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20  pMapRegion,.    
1efa0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1efb0 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d  apSize, pFile->m
1efc0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70  mapSizeActual, p
1efd0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1efe0 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x));.  if( pFile
1eff0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
1f000 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
1f010 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
1f020 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
1f030 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1f040 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1f050 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1f060 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1f070 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1f080 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
1f090 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1f0a0 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
1f0b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1f0c0 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
1f0d0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1f0e0 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
1f0f0 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
1f100 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
1f110 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1f120 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1f130 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1f140 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f160 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20  winUnmapfile1", 
1f170 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1f180 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1f190 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
1f1a0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1f1b0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
1f1c0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1f1d0 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
1f1e0 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
1f1f0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
1f200 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
1f210 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
1f220 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1f230 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1f240 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1f250 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1f260 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1f270 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1f280 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1f290 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
1f2a0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f2b0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f2c0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
1f2d0 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
1f2e0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1f2f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1f300 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1f310 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1f330 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70  inUnmapfile2", p
1f340 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1f350 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68    }.    pFile->h
1f360 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Map = NULL;.  }.
1f370 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1f380 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1f390 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1f3a0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1f3b0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1f3c0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1f3d0 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
1f3e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f3f0 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
1f400 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
1f410 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
1f420 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
1f430 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
1f440 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
1f450 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
1f460 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
1f470 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
1f480 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65   Or, if.** there
1f490 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
1f4a0 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
1f4b0 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
1f4c0 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20  re are still.** 
1f4d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1f4e0 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
1f4f0 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
1f500 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1f510 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1f520 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
1f530 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
1f540 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
1f550 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ted size of.** t
1f560 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
1f570 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
1f580 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
1f590 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
1f5a0 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  n the.** request
1f5b0 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
1f5c0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1f5d0 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
1f5e0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
1f5f0 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
1f600 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
1f610 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1f620 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
1f630 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67  figured.** using
1f640 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
1f650 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76  AP_SIZE, whichev
1f660 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
1f670 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1f680 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
1f690 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
1f6a0 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
1f6b0 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
1f6c0 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
1f6d0 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
1f6e0 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
1f6f0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1f700 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
1f710 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f720 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
1f730 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  File *pFd, sqlit
1f740 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
1f750 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1f760 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
1f770 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1f780 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
1f790 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
1f7a0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1f7b0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1f7c0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65  , pFile=%p, size
1f7d0 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
1f7e0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f7f0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1f800 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69  d, nByte));..  i
1f810 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
1f820 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
1f830 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
1f840 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  Map<0 ){.    rc 
1f850 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
1f860 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64  qlite3_file*)pFd
1f870 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66  , &nMap);.    if
1f880 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53  ( rc ){.      OS
1f890 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1f8a0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1f8b0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1f8c0 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20  ERR_FSTAT\n",.  
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1f8e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1f8f0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20  Id(), pFd));.   
1f900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f910 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1f920 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d    }.  }.  if( nM
1f930 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
1f940 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
1f950 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
1f960 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26  ax;.  }.  nMap &
1f970 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ~(sqlite3_int6
1f980 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  4)(winSysInfo.dw
1f990 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a  PageSize - 1);..
1f9a0 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26    if( nMap==0 &&
1f9b0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30   pFd->mmapSize>0
1f9c0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   ){.    winUnmap
1f9d0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20  file(pFd);.  }. 
1f9e0 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
1f9f0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1fa00 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  void *pNew = 0;.
1fa10 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63      DWORD protec
1fa20 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c  t = PAGE_READONL
1fa30 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61  Y;.    DWORD fla
1fa40 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45  gs = FILE_MAP_RE
1fa50 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61  AD;..    winUnma
1fa60 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20  pfile(pFd);.    
1fa70 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
1fa80 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
1fa90 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
1faa0 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45    protect = PAGE
1fab0 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
1fac0 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f    flags |= FILE_
1fad0 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  MAP_WRITE;.    }
1fae0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1faf0 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INRT.    pFd->hM
1fb00 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1fb10 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1fb20 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
1fb30 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c  otect, nMap, NUL
1fb40 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
1fb50 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1fb60 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64  AS_WIDE).    pFd
1fb70 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1fb80 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46  eFileMappingW(pF
1fb90 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1fba0 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
1fbd0 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
1fbe0 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
1fc10 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
1fc20 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ), NULL);.#elif 
1fc30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1fc40 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
1fc50 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
1fc60 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1fc70 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngA(pFd->h, NULL
1fc80 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fca0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1fcb0 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
1fcc0 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
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 20 20 20 28 44 57               (DW
1fcf0 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
1fd00 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
1fd10 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
1fd20 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29  Fd->hMap==NULL )
1fd30 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  {.      pFd->las
1fd40 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1fd50 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1fd60 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1fd70 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
1fd80 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72  MAP, pFd->lastEr
1fd90 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1fdb0 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e  Mapfile1", pFd->
1fdc0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a  zPath);.      /*
1fdd0 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20   Log the error, 
1fde0 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72  but continue nor
1fdf0 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73  mal operation us
1fe00 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
1fe10 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
1fe20 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45  E(("MAP-FILE-CRE
1fe30 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
1fe40 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1fe50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe60 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1fe70 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
1fe80 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1fe90 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1fea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1feb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 6e  }.    assert( (n
1fec0 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  Map % winSysInfo
1fed0 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  .dwPageSize)==0 
1fee0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1fef0 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73  izeof(SIZE_T)==s
1ff00 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e  izeof(sqlite3_in
1ff10 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78  t64) || nMap<=0x
1ff20 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20  ffffffff );.#if 
1ff30 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1ff40 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
1ff50 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1ff60 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  p(pFd->hMap, fla
1ff70 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e  gs, 0, (SIZE_T)n
1ff80 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Map);.#else.    
1ff90 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
1ffa0 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70  OfFile(pFd->hMap
1ffb0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28  , flags, 0, 0, (
1ffc0 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
1ffd0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65  ndif.    if( pNe
1ffe0 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  w==NULL ){.     
1fff0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
20000 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20  Fd->hMap);.     
20010 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c   pFd->hMap = NUL
20020 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61  L;.      pFd->la
20030 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
20040 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
20050 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
20060 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
20070 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
20080 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
200a0 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d  nMapfile2", pFd-
200b0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
200c0 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
200d0 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
200e0 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
200f0 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
20100 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
20110 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41  CE(("MAP-FILE-MA
20120 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
20130 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
20150 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20160 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
20170 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
20180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
20190 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
201a0 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
201b0 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ion = pNew;.    
201c0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
201d0 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  nMap;.    pFd->m
201e0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
201f0 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  nMap;.  }..  OST
20200 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
20210 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20220 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
20230 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
20240 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20250 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
20260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20270 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
20280 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20290 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
202a0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
202b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
202c0 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
202d0 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
202e0 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
202f0 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
20300 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
20310 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
20320 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
20330 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
20340 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
20350 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
20360 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
20370 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
20380 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
20390 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
203a0 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
203b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
203c0 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
203d0 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
203e0 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
203f0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
20400 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
20410 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
20420 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
20430 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
20440 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
20450 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
20460 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
20470 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a  must eventually.
20480 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
20490 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
204a0 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29  ing winUnfetch()
204b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
204c0 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33  winFetch(sqlite3
204d0 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
204e0 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
204f0 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
20500 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20510 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20  IZE>0.  winFile 
20520 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  *pFd = (winFile*
20530 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
20540 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
20550 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
20560 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f  .  *pp = 0;..  O
20570 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
20580 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
20590 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61  , offset=%lld, a
205a0 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c  mount=%d, pp=%p\
205b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
205c0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
205d0 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66  ssId(), fd, iOff
205e0 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23  , nAmt, pp));..#
205f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
20600 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
20610 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
20620 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
20630 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
20640 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
20650 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
20660 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
20670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20680 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  ){.        OSTRA
20690 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
206a0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
206b0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
206c0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
206d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
206e0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
206f0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
20700 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20720 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
20730 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
20740 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
20750 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
20760 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
20770 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
20780 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
20790 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
207a0 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
207b0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
207c0 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63  p=%p, *pp=%p, rc
207d0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
207e0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
207f0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20800 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29  ), fd, pp, *pp))
20810 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20820 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
20830 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
20840 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
20850 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
20860 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a  tion releases a.
20870 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
20880 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
20890 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46  ier call to winF
208a0 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
208b0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
208c0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
208d0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
208e0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
208f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
20900 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
20910 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
20920 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63  winFetch() invoc
20930 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ation..**.** Or,
20940 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
20950 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
20960 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
20970 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
20980 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  ed.** to inform 
20990 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
209a0 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
209b0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
209c0 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  ting mapping.** 
209d0 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
209e0 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
209f0 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
20a00 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
20a10 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
20a20 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
20a30 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
20a40 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
20a50 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
20a60 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
20a70 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
20a80 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
20a90 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
20aa0 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
20ab0 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
20ac0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
20ad0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
20ae0 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
20af0 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
20b00 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
20b10 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
20b20 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
20b30 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
20b40 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
20b50 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
20b60 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
20b70 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
20b80 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
20b90 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
20ba0 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
20bb0 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
20bc0 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
20bd0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
20be0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
20bf0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
20c00 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
20c10 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
20c20 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
20c30 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20c40 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20c50 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
20c60 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
20c70 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
20c80 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
20c90 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
20ca0 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
20cb0 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
20cc0 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
20cd0 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
20ce0 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
20cf0 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
20d00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
20d10 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
20d20 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
20d30 63 65 73 73 61 72 79 20 63 61 6e 20 62 65 20 6f  cessary can be o
20d40 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69  mitted - potenti
20d50 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20  ally improving. 
20d60 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63     ** performanc
20d70 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e  e.  */.    winUn
20d80 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
20d90 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
20da0 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
20db0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
20dc0 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
20dd0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
20de0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
20df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
20e00 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
20e10 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65  Id(), fd));.  re
20e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20e30 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
20e40 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
20e50 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
20e60 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
20e70 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
20e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
20e90 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
20ea0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
20eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ec0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
20ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f10 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
20f20 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
20f30 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
20f40 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
20f50 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
20f60 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
20f70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
20f80 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
20f90 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
20fa0 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20  d = {.  3,      
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
20fd0 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
20fe0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
21000 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c  se */.  winRead,
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
21030 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20   */.  winWrite, 
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
21060 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  */.  winTruncate
21070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21080 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
21090 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20  e */.  winSync, 
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
210c0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  */.  winFileSize
210d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
210e0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
210f0 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20  e */.  winLock, 
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
21120 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20  */.  winUnlock, 
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
21150 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73  */.  winCheckRes
21160 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
21170 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
21180 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
21190 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  winFileControl, 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
211c0 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  */.  winSectorSi
211d0 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
211e0 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
211f0 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69  ize */.  winDevi
21200 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21210 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76  s,       /* xDev
21220 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21230 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61  cs */.  winShmMa
21240 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
21250 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
21260 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  ap */.  winShmLo
21270 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
21280 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
21290 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42  ock */.  winShmB
212a0 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
212b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
212c0 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
212d0 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212f0 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77  xShmUnmap */.  w
21300 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  inFetch,        
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21320 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69  * xFetch */.  wi
21330 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20  nUnfetch        
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21350 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a   xUnfetch */.};.
21360 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
21370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 73 71 6c 69  *********** sqli
213d0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
213e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
213f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
21400 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
21410 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
21420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
21430 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
21440 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
21450 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65  ject..*/..#if de
21460 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
21470 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  )./*.** Convert 
21480 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20  a filename from 
21490 77 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64  whatever the und
214a0 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
214b0 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70  g system.** supp
214c0 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d  orts for filenam
214d0 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20  es into UTF-8.  
214e0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
214f0 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f  e result is.** o
21500 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
21510 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
21520 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
21530 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
21540 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
21550 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
21560 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f  ilename(const vo
21570 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  id *zFilename){.
21580 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74    char *zConvert
21590 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73  ed = 0;.  if( os
215a0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  IsNT() ){.    zC
215b0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e  onverted = winUn
215c0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c  icodeToUtf8(zFil
215d0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
215e0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
215f0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
21600 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
21610 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
21620 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69  mbcs_to_utf8(zFi
21630 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  lename);.  }.#en
21640 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
21650 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
21660 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
21670 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
21680 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
21690 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
216a0 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
216b0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
216c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
216d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
216e0 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
216f0 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
21700 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
21710 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
21720 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
21730 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
21740 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
21750 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
21760 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65  c void *winConve
21770 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
21780 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
21790 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
217a0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
217b0 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  0;.  if( osIsNT(
217c0 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
217d0 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ted = winUtf8ToU
217e0 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
217f0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
21800 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
21810 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
21820 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
21830 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
21840 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  to_mbcs(zFilenam
21850 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
21860 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
21870 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
21880 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
21890 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
218a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
218b0 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
218c0 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
218d0 69 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69  ified UTF-8 stri
218e0 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64  ng buffer.** end
218f0 73 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f  s with a directo
21900 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
21910 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61  racter or one wa
21920 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a  s successfully.*
21930 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a  * added to it..*
21940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
21950 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
21960 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
21970 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75  zBuf){.  if( zBu
21980 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  f ){.    int nLe
21990 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
219a0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69  n30(zBuf);.    i
219b0 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  f( nLen>0 ){.   
219c0 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53     if( winIsDirS
219d0 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29  ep(zBuf[nLen-1])
219e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
219f0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
21a00 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75  e if( nLen+1<nBu
21a10 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  f ){.        zBu
21a20 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74  f[nLen] = winGet
21a30 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20  DirSep();.      
21a40 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d    zBuf[nLen+1] =
21a50 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72   '\0';.        r
21a60 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
21a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21a80 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
21a90 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
21aa0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  ry file name and
21ab0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
21ac0 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74  ting pointer int
21ad0 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20  o pzBuf..** The 
21ae0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
21af0 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62   in pzBuf must b
21b00 65 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69  e freed via sqli
21b10 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
21b20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
21b30 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33  Tempname(sqlite3
21b40 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72  _vfs *pVfs, char
21b50 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61   **pzBuf){.  sta
21b60 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b  tic char zChars[
21b70 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
21b80 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
21b90 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
21ba0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
21bb0 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
21bc0 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74  56789";.  size_t
21bd0 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72   i, j;.  int nPr
21be0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
21bf0 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  n30(SQLITE_TEMP_
21c00 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20  FILE_PREFIX);.  
21c10 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20  int nMax, nBuf, 
21c20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68  nDir, nLen;.  ch
21c30 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20  ar *zBuf;..  /* 
21c40 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
21c50 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
21c60 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
21c70 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
21c80 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
21c90 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
21ca0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
21cb0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
21cc0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
21cd0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20  tion failing..  
21ce0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
21cf0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
21d00 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
21d10 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65  /* Allocate a te
21d20 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
21d30 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  o store the full
21d40 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
21d50 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74  .  ** name for t
21d60 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
21d70 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c  e.  If this fail
21d80 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  s, we cannot con
21d90 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  tinue..  */.  nM
21da0 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  ax = pVfs->mxPat
21db0 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d  hname; nBuf = nM
21dc0 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d  ax + 2;.  zBuf =
21dd0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
21de0 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66  ro( nBuf );.  if
21df0 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f  ( !zBuf ){.    O
21e00 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21e10 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21e20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21e30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
21e40 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21e50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
21e60 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
21e70 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64  tive temporary d
21e80 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74  irectory.  First
21e90 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20  , check if one. 
21ea0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70   ** has been exp
21eb0 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74  licitly set by t
21ec0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20  he application; 
21ed0 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  otherwise, use t
21ee0 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66  he one.  ** conf
21ef0 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70  igured by the op
21f00 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a  erating system..
21f10 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d    */.  nDir = nM
21f20 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29  ax - (nPre + 15)
21f30 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72  ;.  assert( nDir
21f40 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  >0 );.  if( sqli
21f50 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
21f60 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44  ry ){.    int nD
21f70 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  irLen = sqlite3S
21f80 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f  trlen30(sqlite3_
21f90 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
21fa0 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e  .    if( nDirLen
21fb0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
21fc0 21 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c  !winIsDirSep(sql
21fd0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
21fe0 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20  ory[nDirLen-1]) 
21ff0 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c  ){.        nDirL
22000 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  en++;.      }.  
22010 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
22020 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nDir ){.        
22030 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22040 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  f);.        OSTR
22050 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22060 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
22070 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ROR\n"));.      
22080 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
22090 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
220a0 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
220b0 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20  pname1", 0);.   
220c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
220d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
220e0 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71  , zBuf, "%s", sq
220f0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
22100 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tory);.    }.  }
22110 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
22120 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b  YGWIN__).  else{
22130 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
22140 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
22150 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f   = {.       0, /
22160 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  * getenv("SQLITE
22170 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  _TMPDIR") */.   
22180 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
22190 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  ("TMPDIR") */.  
221a0 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
221b0 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20  v("TMP") */.    
221c0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
221d0 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  "TEMP") */.     
221e0 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
221f0 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f  USERPROFILE") */
22200 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  .       "/var/tm
22210 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72  p",.       "/usr
22220 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f  /tmp",.       "/
22230 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22  tmp",.       "."
22240 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20  ,.       0      
22250 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
22260 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  ator */.    };. 
22270 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
22280 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  i;.    const cha
22290 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
222a0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
222b0 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
222c0 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
222d0 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
222e0 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
222f0 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
22300 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69  "TMPDIR");.    i
22310 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20  f( !azDirs[2] ) 
22320 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65  azDirs[2] = gete
22330 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69  nv("TMP");.    i
22340 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20  f( !azDirs[3] ) 
22350 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65  azDirs[3] = gete
22360 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20  nv("TEMP");.    
22370 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29  if( !azDirs[4] )
22380 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74   azDirs[4] = get
22390 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
223a0 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
223b0 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
223c0 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
223d0 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
223e0 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f  [i++]){.      vo
223f0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
22400 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d        if( zDir==
22410 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22420 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
22430 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61  th starts with a
22440 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f   drive letter fo
22450 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f  llowed by the co
22460 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  lon.      ** cha
22470 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69  racter, assume i
22480 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e  t is already a n
22490 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
224a0 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  ; otherwise,.   
224b0 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65     ** it must be
224c0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20   converted to a 
224d0 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
224e0 68 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e  h via the Cygwin
224f0 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72   API.      ** pr
22500 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e  ior to using it.
22510 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22520 69 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65  if( winIsDriveLe
22530 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69  tterAndColon(zDi
22540 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  r) ){.        zC
22550 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
22560 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
22570 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20  ename(zDir);.   
22580 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65       if( !zConve
22590 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rted ){.        
225a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
225b0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
225c0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
225d0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
225e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
225f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
22600 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22610 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
22620 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
22630 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
22640 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
22650 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22660 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22670 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20  s", zDir);.     
22680 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22690 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
226a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
226b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
226c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
226d0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
226e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
226f0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
22700 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
22710 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20   nMax+1 );.     
22720 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74     if( !zConvert
22730 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
22740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22750 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
22760 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22770 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22780 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
22790 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
227a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
227b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
227c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67  .        if( cyg
227d0 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
227f0 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f  sIsNT() ? CCP_PO
22800 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43  SIX_TO_WIN_W : C
22810 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
22820 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20  A, zDir,.       
22830 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72           zConver
22840 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29  ted, nMax+1)<0 )
22850 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
22860 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22870 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
22880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22890 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
228a0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
228b0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
228c0 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e  IOERR_CONVPATH\n
228d0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
228e0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
228f0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  r(SQLITE_IOERR_C
22900 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
22910 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
22940 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20  ame2", zDir);.  
22950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22960 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
22970 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
22980 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
22990 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
229a0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69  the candidate di
229b0 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61  rectory exists a
229c0 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20  nd should.      
229d0 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20      ** be used. 
229e0 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79   However, we may
229f0 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   need to convert
22a00 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74   the string cont
22a10 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  aining.         
22a20 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74   ** its name int
22a30 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66  o UTF-8 (i.e. if
22a40 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69   it is UTF-16 ri
22a50 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20  ght now)..      
22a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22a70 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
22a80 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
22a90 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74  ilename(zConvert
22aa0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ed);.          i
22ab0 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20  f( !zUtf8 ){.   
22ac0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22ad0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22ae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
22af0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
22b00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f  );.            O
22b10 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22b20 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22b30 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
22b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
22b60 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
22b70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22b80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22b90 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
22ba0 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
22bb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22bc0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
22bd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22be0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22bf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22c10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22c20 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22c30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c   }.    }.  }.#el
22c40 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
22c50 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
22c60 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
22c70 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  se if( osIsNT() 
22c80 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
22c90 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20  lti;.    LPWSTR 
22ca0 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69  zWidePath = sqli
22cb0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
22cc0 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  Max*sizeof(WCHAR
22cd0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57  ) );.    if( !zW
22ce0 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  idePath ){.     
22cf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22d00 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
22d10 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22d20 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22d30 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22d40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22d50 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22d60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
22d70 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61  GetTempPathW(nMa
22d80 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  x, zWidePath)==0
22d90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22da0 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
22db0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22dc0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22dd0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22de0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22df0 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
22e00 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
22e10 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
22e20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
22e30 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
22e40 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
22e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22e60 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
22e70 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29  etTempname2", 0)
22e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c  ;.    }.    zMul
22e90 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ti = winUnicodeT
22ea0 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
22eb0 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
22ec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22ed0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
22ee0 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75   zBuf, "%s", zMu
22ef0 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
22f00 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
22f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22f20 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
22f30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22f40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22f50 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
22f60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22f70 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
22f80 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22f90 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22fa0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22fb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22fc0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22fd0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
22fe0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
22ff0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
23000 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
23010 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50      char *zMbcsP
23020 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
23030 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b  locZero( nMax );
23040 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50  .    if( !zMbcsP
23050 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
23060 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
23070 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23080 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
23090 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
230a0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
230b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
230c0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
230d0 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
230e0 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a  empPathA(nMax, z
230f0 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a  MbcsPath)==0 ){.
23100 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23110 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23120 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23130 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
23140 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
23150 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
23160 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
23170 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
23180 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47  GETTEMPPATH, osG
23190 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
231c0 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20  empname3", 0);. 
231d0 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d     }.    zUtf8 =
231e0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
231f0 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63  bcs_to_utf8(zMbc
23200 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  sPath);.    if( 
23210 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
23220 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23230 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
23240 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
23250 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
23260 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
23270 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23280 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23290 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
232a0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
232b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
232c0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
232d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
232e0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
232f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
23300 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a  WIN32_HAS_ANSI *
23310 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  /.#endif /* !SQL
23320 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a  ITE_OS_WINRT */.
23330 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
23340 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
23350 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
23360 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20  ctory ends with 
23370 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  an appropriate. 
23380 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20   ** separator.  
23390 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  If it does not a
233a0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  nd there is not 
233b0 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66  enough space lef
233c0 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e  t to add.  ** on
233d0 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20  e, fail..  */.  
233e0 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49  if( !winMakeEndI
233f0 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20  nDirSep(nDir+1, 
23400 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c  zBuf) ){.    sql
23410 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
23420 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
23430 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23440 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
23450 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
23460 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
23470 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
23480 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29  etTempname4", 0)
23490 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
234a0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
234b0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
234c0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
234d0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
234e0 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69  file.  ** name i
234f0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
23500 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a  format:.  **.  *
23510 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f  *   "<temporary_
23520 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71  directory>/etilq
23530 73 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58  s_XXXXXXXXXXXXXX
23540 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a  X\0\0".  **.  **
23550 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
23560 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54  SQLITE_ERROR.  T
23570 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20  he number 17 is 
23580 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64  used here in ord
23590 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75  er to.  ** accou
235a0 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65  nt for the space
235b0 20 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20   used by the 15 
235c0 63 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d  character random
235d0 20 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a   suffix and the.
235e0 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e    ** two trailin
235f0 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73  g NUL characters
23600 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72  .  The final dir
23610 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
23620 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20   character.  ** 
23630 68 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65  has already adde
23640 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  d if it was not 
23650 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e  already present.
23660 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73  .  */.  nLen = s
23670 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23680 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65  Buf);.  if( (nLe
23690 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e  n + nPre + 17) >
236a0 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c   nBuf ){.    sql
236b0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
236c0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
236d0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
236e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
236f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
23700 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
23710 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
23720 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29  etTempname5", 0)
23730 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
23740 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
23750 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65  6-nLen, zBuf+nLe
23760 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  n, SQLITE_TEMP_F
23770 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20  ILE_PREFIX);..  
23780 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
23790 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c  n30(zBuf);.  sql
237a0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
237b0 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
237c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
237d0 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  i++, j++){.    z
237e0 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
237f0 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
23800 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
23810 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
23820 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  1) ];.  }.  zBuf
23830 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b  [j] = 0;.  zBuf[
23840 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42  j+1] = 0;.  *pzB
23850 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53  uf = zBuf;..  OS
23860 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
23870 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ENAME name=%s, r
23880 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
23890 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
238a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
238b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
238c0 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
238d0 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64  le is really a d
238e0 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72  irectory.  Retur
238f0 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74  n false if.** it
23900 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   is something ot
23910 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63  her than a direc
23920 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72  tory, or if ther
23930 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
23940 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63   memory.** alloc
23950 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  ation failure..*
23960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
23970 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
23980 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20   *zConverted){. 
23990 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
239a0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
239b0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
239c0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
239d0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
239e0 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
239f0 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
23a00 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
23a10 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
23a20 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
23a30 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
23a40 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
23a50 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
23a60 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
23a70 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
23aa0 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
23ad0 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79  ta)) && winRetry
23ae0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
23af0 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20  tErrno) ){}.    
23b00 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
23b10 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e   return 0; /* In
23b20 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20  valid name? */. 
23b30 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20     }.    attr = 
23b40 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
23b50 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20  Attributes;.#if 
23b60 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
23b70 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
23b80 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
23b90 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
23ba0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
23bb0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
23bc0 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c  urn (attr!=INVAL
23bd0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
23be0 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c  ES) && (attr&FIL
23bf0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
23c00 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  CTORY);.}../*.**
23c10 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f   Open a file..*/
23c20 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
23c30 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
23c40 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
23c50 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20   /* Used to get 
23c60 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d  maximum path nam
23c70 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f  e length */.  co
23c80 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
23c90 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
23ca0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
23cb0 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
23cc0 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
23cd0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
23ce0 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64  SQLite file hand
23cf0 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
23d00 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
23d10 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d         /* Open m
23d20 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  ode flags */.  i
23d30 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
23d40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
23d50 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20  us return flags 
23d60 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  */.){.  HANDLE h
23d70 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
23d80 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44  rno = 0;.  DWORD
23d90 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
23da0 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
23db0 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
23dc0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
23dd0 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
23de0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
23df0 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
23e00 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
23e10 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
23e20 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
23e30 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
23e40 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
23e50 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
23e60 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
23e70 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e  me in OS encodin
23e80 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
23e90 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a  r *zUtf8Name = z
23ea0 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  Name; /* Filenam
23eb0 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  e in UTF-8 encod
23ec0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ing */.  int cnt
23ed0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
23ee0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
23ef0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
23f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
23f10 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
23f20 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
23f30 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
23f40 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
23f50 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
23f60 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
23f70 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20   *zTmpname = 0; 
23f80 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  /* For temporary
23f90 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65   filename, if ne
23fa0 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69  cessary. */..  i
23fb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23fc0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
23fd0 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
23fe0 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65   Code */.#if !de
23ff0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
24000 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
24010 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
24020 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
24030 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
24040 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
24050 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  dif..  int isExc
24060 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
24070 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
24080 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
24090 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
240a0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
240b0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
240c0 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
240d0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
240e0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
240f0 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
24100 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
24110 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
24120 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
24130 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
24140 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
24150 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24160 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
24170 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  UG.  int isOpenJ
24180 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
24190 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
241a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
241b0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
241c0 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  L.     || eType=
241d0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
241e0 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c  N_JOURNAL.     |
241f0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24200 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23  OPEN_WAL.  ));.#
24210 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
24220 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
24230 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73   pFile=%p, flags
24240 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  =%x, pOutFlags=%
24250 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
24260 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20   zUtf8Name, id, 
24270 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  flags, pOutFlags
24280 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ));..  /* Check 
24290 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
242a0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
242b0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  e:.  **.  **   (
242c0 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
242d0 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
242e0 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
242f0 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
24300 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  and.  **   (b) i
24310 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
24320 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
24330 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
24340 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
24350 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
24360 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
24370 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
24380 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
24390 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
243a0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
243b0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
243c0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
243d0 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
243e0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
243f0 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
24400 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
24410 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
24420 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
24430 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
24440 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
24450 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
24460 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
24470 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
24480 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
24490 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
244a0 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
244b0 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
244c0 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a  al are never.  *
244d0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
244e0 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
244f0 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
24500 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
24510 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24520 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24530 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24540 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
24550 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24560 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24570 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24580 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
24590 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
245a0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
245b0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
245c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
245d0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
245e0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
245f0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
24600 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
24610 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
24620 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
24630 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
24640 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
24650 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
24660 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
24670 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24680 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
24690 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
246a0 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20 20  EN_TEMP_DB.     
246b0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
246c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
246d0 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
246e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
246f0 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c  JOURNAL.       |
24700 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24710 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
24720 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
24730 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
24740 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c  OURNAL.       ||
24750 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24760 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
24770 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24780 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
24790 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
247a0 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  !=0 );.  memset(
247b0 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
247c0 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46  (winFile));.  pF
247d0 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  ile->h = INVALID
247e0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a  _HANDLE_VALUE;..
247f0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
24800 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38  NRT.  if( !zUtf8
24810 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33  Name && !sqlite3
24820 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
24830 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
24840 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  og(SQLITE_ERROR,
24850 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65  .        "sqlite
24860 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
24870 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
24880 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52   be set for WinR
24890 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T");.  }.#endif.
248a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
248b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
248c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
248d0 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
248e0 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
248f0 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73   file name to us
24900 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55  e.  */.  if( !zU
24910 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
24920 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20  ssert( isDelete 
24930 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
24940 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  l );.    rc = wi
24950 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  nGetTempname(pVf
24960 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  s, &zTmpname);. 
24970 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  E_OK ){.      OS
24990 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
249a0 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55  e=%s, rc=%s", zU
249b0 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  tf8Name, sqlite3
249c0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
249d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
249e0 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
249f0 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
24a00 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
24a10 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
24a20 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
24a30 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
24a40 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
24a50 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
24a60 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
24a70 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
24a80 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
24a90 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
24aa0 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
24ab0 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
24ac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
24ad0 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
24ae0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
24af0 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38   ||.       zUtf8
24b00 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  Name[sqlite3Strl
24b10 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b  en30(zUtf8Name)+
24b20 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  1]==0 );..  /* C
24b30 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
24b40 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
24b50 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
24b60 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
24b70 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
24b80 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
24b90 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
24ba0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
24bb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
24bc0 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
24bd0 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
24be0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
24bf0 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66  ERR_NOMEM", zUtf
24c00 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
24c10 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
24c20 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69  _NOMEM;.  }..  i
24c30 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
24c40 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73  verted) ){.    s
24c50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24c60 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
24c70 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
24c80 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
24c90 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
24ca0 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
24cb0 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66  PEN_ISDIR", zUtf
24cc0 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
24cd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
24ce0 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a  PEN_ISDIR;.  }..
24cf0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
24d00 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  e ){.    dwDesir
24d10 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
24d20 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
24d30 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
24d40 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
24d50 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
24d60 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
24d70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
24d80 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f  USIVE is used to
24d90 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
24da0 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20 20  a new file is.  
24db0 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
24dc0 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
24dd0 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
24de0 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
24df0 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75  .  ** as it is u
24e00 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f  sually understoo
24e10 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
24e20 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
24e30 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65   /* Creates a ne
24e40 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  w file, only if 
24e50 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
24e60 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20  ady exist. */.  
24e70 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
24e80 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c   exists, it fail
24e90 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
24ea0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
24eb0 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20  = CREATE_NEW;.  
24ec0 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61  }else if( isCrea
24ed0 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  te ){.    /* Ope
24ee0 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c  n existing file,
24ef0 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74   or create if it
24f00 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
24f10 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
24f20 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
24f30 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c  EN_ALWAYS;.  }el
24f40 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73  se{.    /* Opens
24f50 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66   a file, only if
24f60 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20   it exists. */. 
24f70 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
24f80 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
24f90 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20  EXISTING;.  }.. 
24fa0 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
24fb0 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
24fc0 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
24fd0 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65  E;..  if( isDele
24fe0 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  te ){.#if SQLITE
24ff0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
25000 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
25010 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
25020 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
25030 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
25040 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
25050 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
25060 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
25070 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
250a0 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
250d0 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
250e0 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
250f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
25100 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
25110 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
25120 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
25130 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
25140 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
25150 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
25160 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
25170 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
25180 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
25190 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
251a0 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
251b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
251c0 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
251d0 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
251e0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
251f0 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  CESS;.#endif..  
25200 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
25210 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
25220 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49  NRT.    CREATEFI
25230 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
25240 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64  AMETERS extended
25250 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20  Parameters;.    
25260 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
25270 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65  rs.dwSize = size
25280 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45  of(CREATEFILE2_E
25290 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
252a0 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  RS);.    extende
252b0 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
252c0 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20  leAttributes =. 
252d0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
252e0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
252f0 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
25300 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
25310 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
25320 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c  FileFlags = dwFl
25330 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
25340 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53   & FILE_FLAG_MAS
25350 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
25360 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75  arameters.dwSecu
25370 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53  rityQosFlags = S
25380 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55  ECURITY_ANONYMOU
25390 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  S;.    extendedP
253a0 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75  arameters.lpSecu
253b0 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d  rityAttributes =
253c0 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e   NULL;.    exten
253d0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54  dedParameters.hT
253e0 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55  emplateFile = NU
253f0 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  LL;.    while( (
25400 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
25410 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  2((LPCWSTR)zConv
25420 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
25450 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25470 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
25480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
254a0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
254b0 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72      &extendedPar
254e0 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c  ameters))==INVAL
254f0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
25500 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
25530 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
25540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25550 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
25560 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68    }.#else.    wh
25570 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
25580 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
25590 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
255a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255b0 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
255c0 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255e0 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
255f0 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25610 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
25620 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
25630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
25660 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
25670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25680 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
25690 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
256a0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
256d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
256e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
256f0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
25700 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
25710 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
25720 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
25730 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
25740 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
25750 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76  eA((LPCSTR)zConv
25760 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25780 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
25790 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
257c0 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
257f0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
25820 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
25850 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
25860 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
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 77 69 6e 52              winR
25890 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
258a0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
258c0 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20   Noop */.    }. 
258d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c   }.#endif.  winL
258e0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20  ogIoerr(cnt);.. 
258f0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
25900 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
25910 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63  , access=%lx, rc
25920 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
25930 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
25940 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
25950 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
25960 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
25970 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
25980 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
25990 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
259a0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
259b0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
259c0 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
259d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
259e0 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
259f0 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
25a00 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
25a10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25a20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
25a30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
25a40 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
25a50 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
25a60 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
25a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
25a80 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
25a90 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28  , id,.         (
25aa0 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50  (flags|SQLITE_OP
25ab0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20  EN_READONLY) &. 
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ad0 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45      ~(SQLITE_OPE
25ae0 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
25af0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29  OPEN_READWRITE))
25b00 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46  ,.         pOutF
25b10 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lags);.    }else
25b20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
25b30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
25b40 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
25b50 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
25b60 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  ){.    if( isRea
25b70 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  dWrite ){.      
25b80 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
25b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
25ba0 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
25bb0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
25bc0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
25bd0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
25be0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  }..  OSTRACE(("O
25bf0 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d  PEN file=%p, nam
25c00 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78  e=%s, access=%lx
25c10 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20  , pOutFlags=%p, 
25c20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22  *pOutFlags=%d, "
25c30 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d  .           "rc=
25c40 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e  %s\n", h, zUtf8N
25c50 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
25c60 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c  cess, pOutFlags,
25c70 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20   pOutFlags ?.   
25c80 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61          *pOutFla
25c90 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41  gs : 0, (h==INVA
25ca0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
25cb0 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
25cc0 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ok"));..#if SQLI
25cd0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
25ce0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
25cf0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25d00 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20  PEN_MAIN_DB.    
25d10 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63     && (rc = winc
25d20 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
25d30 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49  e, pFile))!=SQLI
25d40 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f  TE_OK.  ){.    o
25d50 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b  sCloseHandle(h);
25d60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25d70 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25d80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25d90 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f  zTmpname);.    O
25da0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45  STRACE(("OPEN-CE
25db0 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72  -LOCK name=%s, r
25dc0 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20  c=%s\n", zName, 
25dd0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
25de0 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  c)));.    return
25df0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   rc;.  }.  if( i
25e00 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69  sTemp ){.    pFi
25e10 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
25e20 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b  se = zConverted;
25e30 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
25e40 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    {.    sqlite3_
25e50 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
25e60 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
25e70 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
25e80 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
25e90 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d = &winIoMethod
25ea0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20  ;.  pFile->pVfs 
25eb0 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d  = pVfs;.  pFile-
25ec0 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73  >h = h;.  if( is
25ed0 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
25ee0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
25ef0 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e   |= WINFILE_RDON
25f00 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  LY;.  }.  if( sq
25f10 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
25f20 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  n(zName, "psow",
25f30 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
25f40 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
25f50 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
25f60 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
25f70 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  PSOW;.  }.  pFil
25f80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
25f90 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
25fa0 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
25fb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
25fc0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46  MMAP_SIZE>0.  pF
25fd0 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
25fe0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ;.  pFile->pMapR
25ff0 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69  egion = 0;.  pFi
26000 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
26010 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
26020 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
26030 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
26040 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
26050 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
26060 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e  ;.#endif..  Open
26070 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
26080 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26090 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
260a0 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
260b0 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77  Note that Window
260c0 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
260d0 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
260e0 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
260f0 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
26100 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
26110 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
26120 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
26130 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
26140 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
26150 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
26160 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
26170 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
26180 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
26190 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
261a0 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
261b0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
261c0 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
261d0 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
261e0 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
261f0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
26200 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
26210 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
26220 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
26230 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
26240 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
26250 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
26260 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
26270 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
26280 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
26290 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
262a0 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
262b0 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a   int winDelete(.
262c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
262d0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs,          /*
262e0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
262f0 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
26300 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
26310 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
26320 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ile to delete */
26330 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20  .  int syncDir  
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26350 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
26360 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n32 */.){.  int 
26370 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  cnt = 0;.  int r
26380 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  c;.  DWORD attr;
26390 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
263a0 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  no = 0;.  void *
263b0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
263c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
263d0 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vfs);.  UNUSED_P
263e0 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72  ARAMETER(syncDir
263f0 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
26400 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
26410 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
26420 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
26430 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73  ELETE name=%s, s
26440 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46  yncDir=%d\n", zF
26450 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72  ilename, syncDir
26460 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ));..  zConverte
26470 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
26480 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
26490 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
264a0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
264b0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
264c0 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
264d0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
264e0 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e  NOMEM\n", zFilen
264f0 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
26500 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
26510 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
26520 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
26530 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  do {.#if SQLITE_
26540 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57  OS_WINRT.      W
26550 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
26560 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
26570 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  ta;.      memset
26580 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
26590 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
265a0 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f  ));.      if ( o
265b0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
265c0 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64  esExW(zConverted
265d0 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53  , GetFileExInfoS
265e0 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
26610 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20  rData) ){.      
26620 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
26630 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
26640 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tes;.      }else
26650 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
26660 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
26670 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
26680 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
26690 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
266a0 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
266b0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
266c0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
266d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
266e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
266f0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
26700 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
26710 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26720 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
26730 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
26740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
26750 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  reak;.      }.#e
26760 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d  lse.      attr =
26770 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
26780 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64  utesW(zConverted
26790 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
267a0 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c  if ( attr==INVAL
267b0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
267c0 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  ES ){.        la
267d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
267e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
267f0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
26800 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
26810 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
26820 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
26830 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
26840 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
26850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
26860 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
26870 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
26880 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
26890 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
268a0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
268b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
268c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
268d0 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
268e0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
268f0 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
26900 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26910 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
26920 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
26930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26940 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
26950 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76  eleteFileW(zConv
26960 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
26970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
26980 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
26990 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
269a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
269b0 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49   if ( !winRetryI
269c0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
269d0 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
269e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
269f0 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20  ROR; /* No more 
26a00 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20  retries. */.    
26a10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26a20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31   }.    } while(1
26a30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
26a40 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
26a50 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
26a60 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20  do {.      attr 
26a70 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
26a80 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65  butesA(zConverte
26a90 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61  d);.      if ( a
26aa0 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr==INVALID_FIL
26ab0 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a  E_ATTRIBUTES ){.
26ac0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
26ad0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
26ae0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
26af0 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
26b00 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
26b10 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
26b20 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
26b30 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
26b40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26b50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
26b60 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
26b70 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
26b80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26b90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26ba0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
26bb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
26bc0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26bd0 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45    if ( attr&FILE
26be0 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
26bf0 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  TORY ){.        
26c00 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26c10 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79  R; /* Files only
26c20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
26c30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26c40 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46    if ( osDeleteF
26c50 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileA(zConverted)
26c60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26c70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44   SQLITE_OK; /* D
26c80 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20  eleted OK. */.  
26c90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26ca0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
26cb0 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26  !winRetryIoerr(&
26cc0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
26cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26ce0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
26cf0 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65  * No more retrie
26d00 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  s. */.        br
26d10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
26d20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d   } while(1);.  }
26d30 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
26d40 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
26d50 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
26d60 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  T ){.    rc = wi
26d70 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
26d80 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c  _IOERR_DELETE, l
26d90 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65  astErrno, "winDe
26da0 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lete", zFilename
26db0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26dc0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29  winLogIoerr(cnt)
26dd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
26de0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
26df0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
26e00 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LETE name=%s, rc
26e10 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%s\n", zFilenam
26e20 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
26e30 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
26e40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
26e50 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e  heck the existen
26e60 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66  ce and status of
26e70 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
26e80 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73  ic int winAccess
26e90 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
26ea0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f  *pVfs,         /
26eb0 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
26ec0 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
26ed0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
26ee0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
26ef0 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
26f00 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26f20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20  Type of test to 
26f30 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c  make on this fil
26f40 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  e */.  int *pRes
26f50 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
26f60 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74    /* OUT: Result
26f70 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61   */.){.  DWORD a
26f80 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
26f90 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
26fa0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
26fb0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
26fc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
26fd0 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c  (pVfs);..  Simul
26fe0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
26ff0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27000 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54  ACCESS; );.  OST
27010 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61  RACE(("ACCESS na
27020 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c  me=%s, flags=%x,
27030 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a   pResOut=%p\n",.
27040 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
27050 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65  name, flags, pRe
27060 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76  sOut));..  zConv
27070 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
27080 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
27090 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
270a0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
270b0 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
270c0 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
270d0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
270e0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
270f0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
27100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27110 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
27120 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
27130 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
27140 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
27150 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
27160 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
27170 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
27180 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
27190 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
271a0 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
271b0 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
271c0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
271d0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271f0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
27200 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
27210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27220 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
27230 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
27240 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
27250 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
27260 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
27270 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
27280 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
27290 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
272a0 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
272b0 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
272c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
272d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
272e0 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
272f0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
27300 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
27310 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
27320 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20  zeHigh==0.      
27330 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
27340 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30  .nFileSizeLow==0
27350 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
27360 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
27370 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
27380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27390 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
273a0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
273b0 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  es;.      }.    
273c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e  }else{.      win
273d0 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  LogIoerr(cnt);. 
273e0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
273f0 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no!=ERROR_FILE_N
27400 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74  OT_FOUND && last
27410 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54  Errno!=ERROR_PAT
27420 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
27430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27440 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
27450 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27460 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
27470 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
27480 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
27490 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20  Access",.       
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a      zFilename);.
274c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
274d0 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
274e0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
274f0 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
27500 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
27510 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
27520 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
27530 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
27540 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
27550 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
27560 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
27570 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
27580 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28  rted);.  switch(
27590 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
275a0 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
275b0 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20  _READ:.    case 
275c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
275d0 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d  ISTS:.      rc =
275e0 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
275f0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
27600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27610 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
27620 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
27630 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
27640 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
27650 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
27660 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20          (attr & 
27670 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
27680 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
27690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
276a0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
276b0 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
276c0 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
276d0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
276e0 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28   rc;.  OSTRACE((
276f0 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
27700 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
27710 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
27720 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
27730 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
27740 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f   pResOut, *pResO
27750 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ut));.  return S
27760 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27770 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
27780 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
27790 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73  fied path name s
277a0 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
277b0 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c  ve letter.** fol
277c0 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e  lowed by a colon
277d0 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
277e0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
277f0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
27800 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  lon(.  const cha
27810 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
27820 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74    return ( sqlit
27830 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e  e3Isalpha(zPathn
27840 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68  ame[0]) && zPath
27850 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a  name[1]==':' );.
27860 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
27870 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
27880 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
27890 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75  name should be u
278a0 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49  sed verbatim.  I
278b0 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  f.** non-zero is
278c0 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74   returned from t
278d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
278e0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
278f0 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a  on must simply.*
27900 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64  * use the provid
27910 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72  ed path name ver
27920 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c  batim -OR- resol
27930 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c  ve it into a ful
27940 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75  l path name.** u
27950 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c  sing the GetFull
27960 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41  PathName Win32 A
27970 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20  PI function (if 
27980 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73  available)..*/.s
27990 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
279a0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
279b0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
279c0 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f  zPathname.){.  /
279d0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
279e0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
279f0 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c  ith a forward sl
27a00 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61  ash or a backsla
27a10 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72  sh, it is either
27a20 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e  .  ** a legal UN
27a30 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65  C name, a volume
27a40 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
27a50 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
27a60 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a  ath name in the.
27a70 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d    ** "Unix" form
27a80 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20  at on Windows.  
27a90 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79  There is no easy
27aa0 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e   way to differen
27ab0 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
27ac0 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f  ** the final two
27ad0 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72   cases; therefor
27ae0 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65  e, we return the
27af0 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61   safer return va
27b00 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a  lue of TRUE.  **
27b10 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73   so that callers
27b20 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
27b30 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73  n will simply us
27b40 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20  e it verbatim.. 
27b50 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
27b60 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65  DirSep(zPathname
27b70 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  [0]) ){.    retu
27b80 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
27b90 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
27ba0 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
27bb0 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e  with a letter an
27bc0 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20  d a colon it is 
27bd0 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a  either a volume.
27be0 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61    ** relative pa
27bf0 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  th or an absolut
27c00 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73  e path.  Callers
27c10 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
27c20 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20  n must not.  ** 
27c30 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74  attempt to treat
27c40 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76   it as a relativ
27c50 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65  e path name (i.e
27c60 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69  . they should si
27c70 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74  mply use.  ** it
27c80 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f   verbatim)..  */
27c90 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69  .  if ( winIsDri
27ca0 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
27cb0 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20  (zPathname) ){. 
27cc0 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
27cd0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
27ce0 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73  f we get to this
27cf0 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68   point, the path
27d00 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d   name should alm
27d10 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65  ost certainly be
27d20 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72   a purely.  ** r
27d30 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65  elative one (i.e
27d40 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65  . not a UNC name
27d50 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20  , not absolute, 
27d60 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72  and not volume r
27d70 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20  elative)..  */. 
27d80 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
27d90 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
27da0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
27db0 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
27dc0 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68  hname.  Write th
27dd0 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61  e full.** pathna
27de0 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20  me into zOut[]. 
27df0 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20   zOut[] will be 
27e00 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d  at least pVfs->m
27e10 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74  xPathname.** byt
27e20 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
27e30 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c  tatic int winFul
27e40 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
27e50 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
27e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
27e70 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
27e80 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
27e90 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20  har *zRelative, 
27ea0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
27eb0 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
27ec0 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
27ed0 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nFull,          
27ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
27ef0 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
27f00 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
27f10 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20   char *zFull    
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f30 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
27f40 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  */.){..#if defin
27f50 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
27f60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
27f70 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
27f80 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45  ERROR );.  UNUSE
27f90 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
27fa0 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46  l);.  assert( nF
27fb0 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74  ull>=pVfs->mxPat
27fc0 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20  hname );.  if ( 
27fd0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
27fe0 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
27ff0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
28000 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
28010 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
28020 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
28030 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
28040 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
28050 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
28060 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
28070 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
28080 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
28090 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
280a0 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
280b0 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
280c0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
280d0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
280e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
280f0 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
28100 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
28110 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20  y and a slash.. 
28120 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
28130 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  zOut = sqlite3Ma
28140 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e  llocZero( pVfs->
28150 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a  mxPathname+1 );.
28160 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b      if( !zOut ){
28170 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28180 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
281a0 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
281b0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f  (.            (o
281c0 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f  sIsNT() ? CCP_PO
281d0 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43  SIX_TO_WIN_W : C
281e0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
281f0 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  A) |.           
28200 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a   CCP_RELATIVE, z
28210 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20  Relative, zOut, 
28220 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28230 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  +1)<0 ){.      s
28240 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
28250 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28260 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
28270 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
28280 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72  PATH, (DWORD)err
28290 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
282b0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c  nFullPathname1",
282c0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
282d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
282e0 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43  ar *zUtf8 = winC
282f0 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65  onvertToUtf8File
28300 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  name(zOut);.    
28310 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a    if( !zUtf8 ){.
28320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28330 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
28340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28350 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
28360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
28370 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
28380 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
28390 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
283a0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
283d0 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
283e0 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66  etDirSep(), zUtf
283f0 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
28400 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
28410 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28420 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  e(zOut);.    }. 
28430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
28440 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33   *zOut = sqlite3
28450 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73  MallocZero( pVfs
28460 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29  ->mxPathname+1 )
28470 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20  ;.    if( !zOut 
28480 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28490 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
284a0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
284b0 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
284c0 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
284d0 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f  (osIsNT() ? CCP_
284e0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
284f0 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
28500 4e 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20  N_A),.          
28510 20 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75    zRelative, zOu
28520 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t, pVfs->mxPathn
28530 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  ame+1)<0 ){.    
28540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28550 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Out);.      retu
28560 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28570 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
28580 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
28590 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285b0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
285c0 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  2", zRelative);.
285d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
285e0 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
285f0 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
28600 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20  ilename(zOut);. 
28610 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
28620 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28630 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
28640 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
28650 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28670 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
28680 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
28690 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
286a0 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66  Full, "%s", zUtf
286b0 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
286c0 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
286d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
286e0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  e(zOut);.    }. 
286f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
28700 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
28710 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
28720 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
28730 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69  _WINRT) && !defi
28740 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
28750 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
28760 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
28770 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57  _ERROR );.  /* W
28780 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63  inCE has no conc
28790 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76  ept of a relativ
287a0 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73  e pathname, or s
287b0 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a  o I am told. */.
287c0 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e    /* WinRT has n
287d0 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74  o way to convert
287e0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
287f0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   to an absolute 
28800 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  one. */.  if ( s
28810 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
28820 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
28830 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
28840 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
28850 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
28860 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
28870 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
28880 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
28890 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
288a0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
288b0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
288c0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
288d0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
288e0 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
288f0 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
28900 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
28910 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
28920 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
28930 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
28940 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
28950 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
28960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
28970 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
28980 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
28990 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
289a0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
289d0 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
289e0 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
289f0 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ive);.  }else{. 
28a00 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
28a10 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
28a20 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
28a30 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
28a40 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20  Relative);.  }. 
28a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28a60 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  K;.#endif..#if !
28a70 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
28a80 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
28a90 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
28aa0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57  __CYGWIN__).  DW
28ab0 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  ORD nByte;.  voi
28ac0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
28ad0 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20   char *zOut;..  
28ae0 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20  /* If this path 
28af0 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
28b00 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58   "/X:", where "X
28b10 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65  " is any alphabe
28b20 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  tic.  ** charact
28b30 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  er, discard the 
28b40 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d  initial "/" from
28b50 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20   the pathname.. 
28b60 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74   */.  if( zRelat
28b70 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77  ive[0]=='/' && w
28b80 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
28b90 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76  ndColon(zRelativ
28ba0 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c  e+1) ){.    zRel
28bb0 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ative++;.  }..  
28bc0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
28bd0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
28be0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
28bf0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
28c00 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
28c10 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
28c20 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
28c30 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
28c40 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
28c50 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
28c60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
28c70 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
28c80 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
28c90 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
28ca0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
28cb0 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
28cc0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
28cd0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
28ce0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
28cf0 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
28d00 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
28d10 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
28d20 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
28d30 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
28d40 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
28d50 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
28d60 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
28d70 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
28d80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
28d90 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
28da0 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
28db0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
28dc0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
28dd0 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
28de0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
28df0 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
28e00 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
28e10 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
28e20 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
28e30 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
28e40 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
28e50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
28e60 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
28e70 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28e80 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
28e90 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
28ea0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28eb0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
28ec0 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
28ed0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28ef0 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
28f00 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
28f10 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
28f20 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  e(zRelative);.  
28f30 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
28f40 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28f50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28f60 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  EM;.  }.  if( os
28f70 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50  IsNT() ){.    LP
28f80 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20  WSTR zTemp;.    
28f90 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
28fa0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
28fb0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
28fc0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
28fd0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
28fe0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28ff0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
29000 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
29010 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
29020 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
29030 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
29040 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
29050 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
29060 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
29070 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
29080 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
29090 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
290a0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
290b0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
290c0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
290d0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
290e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
290f0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
29100 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29110 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
29120 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
29130 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
29140 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
29150 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
29160 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
29170 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
29180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29190 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
291a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
291b0 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  ee(zTemp);.     
291c0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
291d0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
291e0 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73  PEN_FULLPATH, os
291f0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
29220 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65  lPathname2", zRe
29230 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20  lative);.    }. 
29240 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29250 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
29260 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f   zOut = winUnico
29270 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b  deToUtf8(zTemp);
29280 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29290 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69  e(zTemp);.  }.#i
292a0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
292b0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
292c0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
292d0 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
292e0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
292f0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
29300 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rted, 0, 0, 0);.
29310 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
29320 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29330 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29340 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
29350 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
29360 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
29370 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
29380 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
293b0 6d 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me3", zRelative)
293c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
293d0 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
293e0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
293f0 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
29400 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
29410 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
29420 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
29430 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
29440 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
29450 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29460 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
29470 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
29480 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
29490 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  *)zConverted, nB
294a0 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
294b0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
294c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
294d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
294e0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
294f0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
29500 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
29510 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
29520 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
29530 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
29540 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
29560 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c  nFullPathname4",
29570 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
29580 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
29590 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
295a0 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
295b0 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
295c0 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
295d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
295e0 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  zTemp);.  }.#end
295f0 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b  if.  if( zOut ){
29600 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
29610 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
29620 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29630 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
29640 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
29650 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
29660 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29670 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
29680 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29690 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
296a0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
296b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
296c0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
296d0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
296e0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
296f0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
29700 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
29710 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
29720 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
29730 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
29740 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
29750 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29760 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74  *winDlOpen(sqlit
29770 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
29780 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
29790 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ame){.  HANDLE h
297a0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
297b0 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
297c0 6e 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78  nFull = pVfs->mx
297d0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68  Pathname+1;.  ch
297e0 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69  ar *zFull = sqli
297f0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
29800 46 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a  Full );.  void *
29810 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
29820 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29    if( zFull==0 )
29830 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
29840 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
29850 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
29860 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
29870 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
29880 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
29890 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
298a0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
298b0 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c  ull, zFull)!=SQL
298c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
298d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
298e0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
298f0 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
29900 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
29910 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
29920 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
29930 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65   0;.  }.  zConve
29940 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
29950 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
29960 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69  e(zFull);.  sqli
29970 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b  te3_free(zFull);
29980 0a 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a  .#else.  void *z
29990 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
299a0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
299b0 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
299c0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
299d0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e  METER(pVfs);.#en
299e0 64 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  dif.  if( zConve
299f0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
29a00 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
29a10 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
29a20 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
29a30 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
29a40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
29a50 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
29a60 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
29a70 57 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73  WINRT.    h = os
29a80 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
29a90 61 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ary((LPCWSTR)zCo
29aa0 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c  nverted, 0);.#el
29ab0 73 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  se.    h = osLoa
29ac0 64 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53  dLibraryW((LPCWS
29ad0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  TR)zConverted);.
29ae0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
29af0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
29b00 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
29b10 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
29b20 62 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43  braryA((char*)zC
29b30 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23  onverted);.  }.#
29b40 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28  endif.  OSTRACE(
29b50 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
29b60 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
29b70 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
29b80 2a 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  *)h));.  sqlite3
29b90 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29ba0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
29bb0 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76  d*)h;.}.static v
29bc0 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73  oid winDlError(s
29bd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29be0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
29bf0 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e   *zBufOut){.  UN
29c00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29c10 56 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61  Vfs);.  winGetLa
29c20 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
29c30 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
29c40 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73  f, zBufOut);.}.s
29c50 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e  tatic void (*win
29c60 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
29c70 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48  s *pVfs,void *pH
29c80 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79  ,const char *zSy
29c90 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52  m))(void){.  FAR
29ca0 50 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55  PROC proc;.  UNU
29cb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29cc0 66 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73  fs);.  proc = os
29cd0 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
29ce0 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d  (HANDLE)pH, zSym
29cf0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
29d00 4c 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20  LSYM handle=%p, 
29d10 73 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65  symbol=%s, addre
29d20 73 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  ss=%p\n",.      
29d30 20 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20       (void*)pH, 
29d40 7a 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f  zSym, (void*)pro
29d50 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  c));.  return (v
29d60 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f  oid(*)(void))pro
29d70 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
29d80 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69   winDlClose(sqli
29d90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
29da0 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
29db0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29dc0 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65  R(pVfs);.  osFre
29dd0 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
29de0 29 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54  )pHandle);.  OST
29df0 52 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68  RACE(("DLCLOSE h
29e00 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f  andle=%p\n", (vo
29e10 69 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d  id*)pHandle));.}
29e20 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
29e30 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
29e40 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
29e50 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
29e60 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20   winDlOpen  0.  
29e70 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72  #define winDlErr
29e80 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  or 0.  #define w
29e90 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  inDlSym   0.  #d
29ea0 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65  efine winDlClose
29eb0 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
29ec0 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42  * Write up to nB
29ed0 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
29ee0 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66  omness into zBuf
29ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29f00 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  winRandomness(sq
29f10 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29f20 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
29f30 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20  *zBuf){.  int n 
29f40 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
29f50 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
29f60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
29f70 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42  E_TEST).  n = nB
29f80 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75  uf;.  memset(zBu
29f90 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c  f, 0, nBuf);.#el
29fa0 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
29fb0 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75  SYSTEMTIME)<=nBu
29fc0 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45  f-n ){.    SYSTE
29fd0 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47  MTIME x;.    osG
29fe0 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29  etSystemTime(&x)
29ff0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
2a000 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f  uf[n], &x, sizeo
2a010 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(x));.    n += 
2a020 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20  sizeof(x);.  }. 
2a030 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
2a040 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
2a050 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73    DWORD pid = os
2a060 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
2a070 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  sId();.    memcp
2a080 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64  y(&zBuf[n], &pid
2a090 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
2a0a0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
2a0b0 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pid);.  }.#if SQ
2a0c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2a0d0 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47  if( sizeof(ULONG
2a0e0 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  LONG)<=nBuf-n ){
2a0f0 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63  .    ULONGLONG c
2a100 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
2a110 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d  unt64();.    mem
2a120 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
2a130 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
2a140 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
2a150 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73  f(cnt);.  }.#els
2a160 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  e.  if( sizeof(D
2a170 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
2a180 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
2a190 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   osGetTickCount(
2a1a0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
2a1b0 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
2a1c0 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
2a1d0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
2a1e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
2a1f0 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f  f( sizeof(LARGE_
2a200 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e  INTEGER)<=nBuf-n
2a210 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e   ){.    LARGE_IN
2a220 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51  TEGER i;.    osQ
2a230 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
2a240 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20  ounter(&i);.    
2a250 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
2a260 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b   &i, sizeof(i));
2a270 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
2a280 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (i);.  }.#endif.
2a290 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
2a2a0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
2a2b0 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
2a2c0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
2a2d0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
2a2e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a2f0 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
2a300 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2a310 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c  microsec){.  sql
2a320 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
2a330 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
2a340 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f  1000);.  UNUSED_
2a350 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2a360 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72  .  return ((micr
2a370 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a  osec+999)/1000)*
2a380 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  1000;.}../*.** T
2a390 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2a3a0 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
2a3b0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
2a3c0 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
2a3d0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
2a3e0 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
2a3f0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
2a400 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
2a410 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
2a420 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
2a430 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
2a440 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
2a450 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
2a460 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2a470 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
2a480 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
2a490 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
2a4a0 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
2a4b0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2a4c0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2a4d0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2a4e0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2a4f0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
2a500 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
2a510 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
2a520 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
2a530 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
2a540 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
2a550 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
2a560 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
2a570 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
2a580 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
2a590 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
2a5a0 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
2a5b0 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
2a5c0 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
2a5d0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
2a5e0 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
2a5f0 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
2a600 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
2a610 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2a620 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
2a630 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
2a640 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a  time and date.**
2a650 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2a660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a670 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2a680 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
2a690 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
2a6a0 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
2a6b0 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
2a6c0 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
2a6d0 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
2a6e0 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
2a6f0 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  of.     100-nano
2a700 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
2a710 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
2a720 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
2a730 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20  5813.5)..  */.  
2a740 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
2a750 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a760 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
2a770 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
2a780 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
2a790 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
2a7a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2a7b0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2a7c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
2a7d0 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
2a7e0 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
2a7f0 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
2a800 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
2a810 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
2a820 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
2a830 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
2a840 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a850 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
2a860 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c 69  ue =.      (sqli
2a870 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
2a880 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
2a890 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
2a8a0 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65   +.      (sqlite
2a8b0 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39  3_int64)29496729
2a8c0 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  6;..#if SQLITE_O
2a8d0 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d  S_WINCE.  SYSTEM
2a8e0 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47  TIME time;.  osG
2a8f0 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
2a900 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
2a910 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
2a920 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
2a930 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
2a940 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69   if (!osSystemTi
2a950 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
2a960 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
2a970 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a980 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f  R;.  }.#else.  o
2a990 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  sGetSystemTimeAs
2a9a0 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
2a9b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
2a9c0 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
2a9d0 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
2a9e0 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
2a9f0 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
2aa00 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
2aa10 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20 20  Value) +.       
2aa20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2aa30 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44  _int64)ft.dwLowD
2aa40 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65  ateTime)/(sqlite
2aa50 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a  3_int64)10000;..
2aa60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2aa70 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
2aa80 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
2aa90 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
2aaa0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
2aab0 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
2aac0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
2aad0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
2aae0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2aaf0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2ab00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ab10 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2ab20 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2ab30 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2ab40 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2ab50 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
2ab60 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2ab70 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2ab80 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
2ab90 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
2aba0 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
2abb0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2abc0 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
2abd0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
2abe0 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
2abf0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
2ac00 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  Vfs, double *prN
2ac10 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ow){.  int rc;. 
2ac20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2ac30 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72  ;.  rc = winCurr
2ac40 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
2ac50 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72  s, &i);.  if( !r
2ac60 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  c ){.    *prNow 
2ac70 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
2ac80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ac90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64  .}../*.** The id
2aca0 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ea is that this 
2acb0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c  function works l
2acc0 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ike a combinatio
2acd0 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45  n of.** GetLastE
2ace0 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61  rror() and Forma
2acf0 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69  tMessage() on Wi
2ad00 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20  ndows (or errno 
2ad10 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f  and.** strerror_
2ad20 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66  r() on Unix). Af
2ad30 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ter an error is 
2ad40 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f  returned by an O
2ad50 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53  S.** function, S
2ad60 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
2ad70 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a   function with z
2ad80 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a  Buf pointing to.
2ad90 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e  ** a buffer of n
2ada0 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f  Buf bytes. The O
2adb0 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70  S layer should p
2adc0 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62  opulate the.** b
2add0 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c  uffer with a nul
2ade0 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d  -terminated UTF-
2adf0 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20  8 encoded error 
2ae00 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72  message.** descr
2ae10 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49  ibing the last I
2ae20 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  O error to have 
2ae30 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20  occurred within 
2ae40 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74  the calling.** t
2ae50 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  hread..**.** If 
2ae60 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2ae70 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66  e is too large f
2ae80 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  or the supplied 
2ae90 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68  buffer,.** it sh
2aea0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
2aeb0 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  d. The return va
2aec0 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45  lue of xGetLastE
2aed0 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rror.** is zero 
2aee0 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
2aef0 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
2af00 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
2af10 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
2af20 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
2af30 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
2af40 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  . If non-zero is
2af50 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68   returned,.** th
2af60 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  en it is not nec
2af70 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64  essary to includ
2af80 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  e the nul-termin
2af90 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a  ator character.*
2afa0 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  * in the output 
2afb0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  buffer..**.** No
2afc0 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65  t supplying an e
2afd0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
2afe0 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73  l have no advers
2aff0 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53  e effect.** on S
2b000 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e  QLite. It is fin
2b010 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70  e to have an imp
2b020 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
2b030 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e   never.** return
2b040 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2b050 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  ge:.**.**   int 
2b060 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
2b070 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2b080 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2b090 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61  *zBuf){.**     a
2b0a0 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27  ssert(zBuf[0]=='
2b0b0 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74  \0');.**     ret
2b0c0 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  urn 0;.**   }.**
2b0d0 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61  .** However if a
2b0e0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2b0f0 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20  is supplied, it 
2b100 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72  will be incorpor
2b110 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  ated.** by sqlit
2b120 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  e into the error
2b130 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62   message availab
2b140 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75  le to the user u
2b150 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
2b160 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62  errmsg(), possib
2b170 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72  ly making IO err
2b180 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65  ors easier to de
2b190 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
2b1a0 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
2b1b0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2b1c0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2b1d0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
2b1e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b1f0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
2b200 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
2b210 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
2b220 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29  r(), nBuf, zBuf)
2b230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
2b240 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74  alize and deinit
2b250 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
2b260 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
2b270 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
2b280 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
2b290 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
2b2a0 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73  lite3_vfs winVfs
2b2b0 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b2d0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
2b2e0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
2b2f0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
2b300 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  e */.    SQLITE_
2b310 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42  WIN32_MAX_PATH_B
2b320 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e  YTES, /* mxPathn
2b330 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
2b360 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20  "win32",        
2b370 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
2b380 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2b390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
2b3a0 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
2b3b0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2b3c0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2b3d0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2b3e0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2b3f0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2b400 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
2b410 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
2b420 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
2b430 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
2b440 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
2b450 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
2b460 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
2b470 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
2b480 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2b490 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
2b4a0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2b4b0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
2b4c0 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
2b4d0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
2b4e0 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
2b4f0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
2b500 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2b510 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2b520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2b530 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2b540 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2b550 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
2b560 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
2b570 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
2b580 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
2b590 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2b5a0 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72  meInt64, /* xCur
2b5b0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
2b5c0 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
2b5d0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
2b5e0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2b5f0 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
2b600 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
2b610 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2b620 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
2b630 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
2b640 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
2b650 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2b660 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2b670 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c  DE).  static sql
2b680 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67  ite3_vfs winLong
2b690 50 61 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20  PathVfs = {.    
2b6a0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2b6b0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
2b6c0 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
2b6d0 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
2b6e0 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
2b6f0 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
2b700 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
2b710 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
2b720 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2b730 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
2b740 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f  */.    "win32-lo
2b750 6e 67 70 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a  ngpath",    /* z
2b760 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b780 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
2b790 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
2b7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
2b7b0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
2b7c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
2b7d0 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
2b7e0 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
2b7f0 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2b800 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2b810 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
2b820 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
2b830 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
2b840 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
2b850 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
2b860 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
2b870 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
2b880 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
2b890 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
2b8a0 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
2b8b0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
2b8c0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
2b8d0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
2b8e0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
2b8f0 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
2b900 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
2b910 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
2b920 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2b930 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
2b940 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2b950 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2b960 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
2b970 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
2b980 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
2b990 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
2b9a0 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
2b9b0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2b9c0 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
2b9d0 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
2b9e0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
2b9f0 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xGetSystemCall
2ba00 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53   */.    winNextS
2ba10 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20  ystemCall,   /* 
2ba20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
2ba30 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a  */.  };.#endif..
2ba40 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63    /* Double-chec
2ba50 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63  k that the aSysc
2ba60 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20  all[] array has 
2ba70 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
2ba80 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e  .  ** correctly.
2ba90 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62    See ticket [bb
2baa0 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d  3a86e890c8e96ab]
2bab0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72   */.  assert( Ar
2bac0 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
2bad0 29 3d 3d 37 37 20 29 3b 0a 0a 20 20 2f 2a 20 67  )==77 );..  /* g
2bae0 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c  et memory map al
2baf0 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61  location granula
2bb00 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  rity */.  memset
2bb10 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c  (&winSysInfo, 0,
2bb20 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49   sizeof(SYSTEM_I
2bb30 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54  NFO));.#if SQLIT
2bb40 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47  E_OS_WINRT.  osG
2bb50 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
2bb60 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
2bb70 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
2bb80 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
2bb90 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Info);.#endif.  
2bba0 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
2bbb0 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
2bbc0 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a  ranularity>0 );.
2bbd0 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
2bbe0 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e  Info.dwPageSize>
2bbf0 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  0 );..  sqlite3_
2bc00 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
2bc10 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64  nVfs, 1);..#if d
2bc20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2bc30 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2bc40 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
2bc50 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74  ster(&winLongPat
2bc60 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  hVfs, 0);.#endif
2bc70 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2bc80 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  E_OK;.}..int sql
2bc90 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
2bca0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
2bcb0 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65  _WINRT.  if( sle
2bcc0 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj!=NULL ){. 
2bcd0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
2bce0 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20  (sleepObj);.    
2bcf0 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
2bd00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2bd10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bd20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
2bd30 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a        ITE_OS_WIN */.