/ Hex Artifact Content
Login

Artifact 97f7828a9554d753665b6fcf7540e31c2b3d6a6e:


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 65 73 65 20 66 69 6c 65 20 6d 61 70 70   These file mapp
1680: 69 6e 67 20 41 50 49 73 20 61 72 65 20 63 6f 6d  ing APIs are com
1690: 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57 69 6e 33  mon to both Win3
16a0: 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a  2 and WinRT..*/.
16b0: 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c  .WINBASEAPI BOOL
16c0: 20 57 49 4e 41 50 49 20 46 6c 75 73 68 56 69 65   WINAPI FlushVie
16d0: 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c  wOfFile(LPCVOID,
16e0: 20 53 49 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53   SIZE_T);.WINBAS
16f0: 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49  EAPI BOOL WINAPI
1700: 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65   UnmapViewOfFile
1710: 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69  (LPCVOID);.#endi
1720: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
1730: 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50  2_FILEMAPPING_AP
1740: 49 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  I */../*.** Some
1750: 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
1760: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
1770: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
1780: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
1790: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
17a0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
17b0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
17c0: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
17d0: 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f  f..#ifndef FILE_
17e0: 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69  FLAG_MASK.# defi
17f0: 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53  ne FILE_FLAG_MAS
1800: 4b 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46  K          (0xFF
1810: 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a  3C0000).#endif..
1820: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54  #ifndef FILE_ATT
1830: 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65  RIBUTE_MASK.# de
1840: 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42  fine FILE_ATTRIB
1850: 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78  UTE_MASK     (0x
1860: 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66  0003FFF7).#endif
1870: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1880: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72  _OMIT_WAL./* For
1890: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
18a0: 74 6f 20 73 74 72 75 63 74 75 72 65 73 20 75 73  to structures us
18b0: 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79  ed for WAL */.ty
18c0: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
18d0: 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20 20  Shm winShm;     
18e0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65        /* A conne
18f0: 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
1900: 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65  memory */.typede
1910: 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  f struct winShmN
1920: 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20  ode winShmNode; 
1930: 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66    /* A region of
1940: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
1950: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
1960: 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69  WinCE lacks nati
1970: 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66  ve support for f
1980: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77  ile locking so w
1990: 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69  e have to fake i
19a0: 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63  t.** with some c
19b0: 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a  ode of our own..
19c0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
19d0: 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73  _WINCE.typedef s
19e0: 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20  truct winceLock 
19f0: 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73  {.  int nReaders
1a00: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
1a10: 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b  r of reader lock
1a20: 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  s obtained */.  
1a30: 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20  BOOL bPending;  
1a40: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
1a50: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
1a60: 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
1a70: 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73  d */.  BOOL bRes
1a80: 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e  erved;     /* In
1a90: 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76  dicates a reserv
1aa0: 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ed lock has been
1ab0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
1ac0: 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20  OOL bExclusive; 
1ad0: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
1ae0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1af0: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
1b00: 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f  ned */.} winceLo
1b10: 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ck;.#endif../*.*
1b20: 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74  * The winFile st
1b30: 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62  ructure is a sub
1b40: 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33  class of sqlite3
1b50: 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20  _file* specific 
1b60: 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20  to the win32.** 
1b70: 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65  portability laye
1b80: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
1b90: 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e  ruct winFile win
1ba0: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e  File;.struct win
1bb0: 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73  File {.  const s
1bc0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1bd0: 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a  s *pMethod; /***
1be0: 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   Must be first *
1bf0: 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  **/.  sqlite3_vf
1c00: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a  s *pVfs;      /*
1c10: 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74 6f   The VFS used to
1c20: 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20   open this file 
1c30: 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c50: 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73  Handle for acces
1c60: 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f  sing the file */
1c70: 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20  .  u8 locktype; 
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
1c90: 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65  pe of lock curre
1ca0: 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69  ntly held on thi
1cb0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72  s file */.  shor
1cc0: 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
1cd0: 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20  ;   /* Randomly 
1ce0: 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64  chosen byte used
1cf0: 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63   as a shared loc
1d00: 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c  k */.  u8 ctrlFl
1d10: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ags;           /
1d20: 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57 49  * Flags.  See WI
1d30: 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f  NFILE_* below */
1d40: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1d50: 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  no;        /* Th
1d60: 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
1d70: 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
1d80: 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64  O error */.#ifnd
1d90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1da0: 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68  AL.  winShm *pSh
1db0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
1dc0: 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72  Instance of shar
1dd0: 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69  ed memory on thi
1de0: 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  s file */.#endif
1df0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e00: 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75  Path;      /* Fu
1e10: 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1e20: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
1e30: 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20  t szChunk;      
1e40: 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73        /* Chunk s
1e50: 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  ize configured b
1e60: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1e70: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1e80: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53  _OS_WINCE.  LPWS
1e90: 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  TR zDeleteOnClos
1ea0: 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66  e;  /* Name of f
1eb0: 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68  ile to delete wh
1ec0: 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20  en closing */.  
1ed0: 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20  HANDLE hMutex;  
1ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78          /* Mutex
1ef0: 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   used to control
1f00: 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65   access to share
1f10: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44  d lock */.  HAND
1f20: 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20  LE hShared;     
1f30: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
1f40: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65  mory segment use
1f50: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f  d for locking */
1f60: 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63  .  winceLock loc
1f70: 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  al;        /* Lo
1f80: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  cks obtained by 
1f90: 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  this instance of
1fa0: 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69   winFile */.  wi
1fb0: 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b  nceLock *shared;
1fc0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
1fd0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f  shared lock memo
1fe0: 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ry for the file 
1ff0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
2000: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
2010: 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74  IZE>0.  int nFet
2020: 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  chOut;          
2030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2040: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
2050: 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
2060: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61   */.  HANDLE hMa
2070: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2080: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
2090: 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f  r accessing memo
20a0: 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ry mapping */.  
20b0: 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e  void *pMapRegion
20c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20d0: 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70   Area memory map
20e0: 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ped */.  sqlite3
20f0: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b  _int64 mmapSize;
2100: 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65         /* Usable
2110: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2120: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2130: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
2140: 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74  zeActual; /* Act
2150: 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ual size of mapp
2160: 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  ed region */.  s
2170: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
2180: 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20  pSizeMax;    /* 
2190: 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c  Configured FCNTL
21a0: 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65  _MMAP_SIZE value
21b0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
21c0: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
21d0: 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e  ues for winFile.
21e0: 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  ctrlFlags.*/.#de
21f0: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f  fine WINFILE_RDO
2200: 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30  NLY          0x0
2210: 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f  2   /* Connectio
2220: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
2230: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
2240: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20  E_PERSIST_WAL   
2250: 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73    0x04   /* Pers
2260: 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20  istent WAL mode 
2270: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
2280: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20  LE_PSOW         
2290: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c     0x10   /* SQL
22a0: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
22b0: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
22c0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65  ../*. * The size
22d0: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75   of the buffer u
22e0: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  sed by sqlite3_w
22f0: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
2300: 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ().. */.#ifndef 
2310: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
2320: 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66  _BUF_SIZE.#  def
2330: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
2340: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20  _DBG_BUF_SIZE   
2350: 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65  ((int)(4096-size
2360: 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64  of(DWORD))).#end
2370: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61  if../*. * The va
2380: 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71  lue used with sq
2390: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
23a0: 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73  directory() to s
23b0: 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74  pecify that. * t
23c0: 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
23d0: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
23e0: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
23f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41   SQLITE_WIN32_DA
2400: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
2410: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2420: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
2430: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29  RECTORY_TYPE (1)
2440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2450: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69  he value used wi
2460: 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  th sqlite3_win32
2470: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29  _set_directory()
2480: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74   to specify that
2490: 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72  . * the temporar
24a0: 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  y directory shou
24b0: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
24c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24d0: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
24e0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
24f0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2500: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
2510: 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69  Y_TYPE (2).#endi
2520: 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70  f../*. * If comp
2530: 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
2540: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e  _WIN32_MALLOC on
2550: 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c   Windows, we wil
2560: 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72  l use the. * var
2570: 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68  ious Win32 API h
2580: 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  eap functions in
2590: 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e  stead of our own
25a0: 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .. */.#ifdef SQL
25b0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
25c0: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20  ../*. * If this 
25d0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20  is non-zero, an 
25e0: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
25f0: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79  ll be created by
2600: 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33   the native Win3
2610: 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73  2. * allocator s
2620: 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77  ubsystem; otherw
2630: 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74  ise, the default
2640: 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69   process heap wi
2650: 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69  ll be used.  Thi
2660: 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73  s. * setting has
2670: 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20   no effect when 
2680: 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69  compiling for Wi
2690: 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74  nRT.  By default
26a0: 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65  , this is enable
26b0: 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c  d. * and an isol
26c0: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62  ated heap will b
26d0: 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f  e created to sto
26e0: 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64  re all allocated
26f0: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a   data.. *. *****
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52  *********. * WAR
2750: 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f  NING: It is impo
2760: 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68  rtant to note th
2770: 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74  at when this set
2780: 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ting is non-zero
2790: 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20   and the. *     
27a0: 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64       winMemShutd
27b0: 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  own function is 
27c0: 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20  called (e.g. by 
27d0: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74  the sqlite3_shut
27e0: 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  down. *         
27f0: 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20   function), all 
2800: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c  data that was al
2810: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68  located using th
2820: 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  e isolated heap 
2830: 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  will. *         
2840: 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69   be freed immedi
2850: 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74  ately and any at
2860: 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20  tempt to access 
2870: 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65  any of that free
2880: 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61  d. *          da
2890: 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63  ta will almost c
28a0: 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20  ertainly result 
28b0: 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  in an immediate 
28c0: 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e  access violation
28d0: 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *************
28e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2920: 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  *. */.#ifndef SQ
2930: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2940: 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65  CREATE.#  define
2950: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2960: 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52  AP_CREATE    (TR
2970: 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  UE).#endif../*. 
2980: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69  * The initial si
2990: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
29a0: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
29b0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
29c0: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
29d0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
29e0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a  _HEAP_INIT_SIZE.
29f0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2a00: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
2a10: 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44  _SIZE ((SQLITE_D
2a20: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
2a30: 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20  E) * \.         
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2a60: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2a70: 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33  GE_SIZE) + 41943
2a80: 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  04).#endif../*. 
2a90: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  * The maximum si
2aa0: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
2ab0: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
2ac0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
2ad0: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
2ae0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2af0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23  _HEAP_MAX_SIZE.#
2b00: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2b10: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
2b20: 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a  IZE  (0).#endif.
2b30: 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61  ./*. * The extra
2b40: 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e   flags to use in
2b50: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69   calls to the Wi
2b60: 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20  n32 heap APIs.  
2b70: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
2b80: 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68  e. * zero for th
2b90: 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
2ba0: 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  or.. */.#ifndef 
2bb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2bc0: 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e  P_FLAGS.#  defin
2bd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2be0: 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30  EAP_FLAGS     (0
2bf0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ).#endif.../*.**
2c00: 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20   The winMemData 
2c10: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
2c20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71   information req
2c30: 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e  uired by the Win
2c40: 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73  32-specific.** s
2c50: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
2c60: 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ds implementatio
2c70: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
2c80: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2c90: 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75  winMemData;.stru
2ca0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a  ct winMemData {.
2cb0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2cc0: 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20 2f   u32 magic1;   /
2cd0: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
2ce0: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
2cf0: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
2d00: 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c  /.#endif.  HANDL
2d10: 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20  E hHeap; /* The 
2d20: 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65  handle to our he
2d30: 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f  ap. */.  BOOL bO
2d40: 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20  wned;  /* Do we 
2d50: 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e  own the heap (i.
2d60: 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e  e. destroy it on
2d70: 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 23   shutdown)? */.#
2d80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
2d90: 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f 2a  u32 magic2;   /*
2da0: 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f   Magic number to
2db0: 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72   detect structur
2dc0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f  e corruption. */
2dd0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e  .#endif.};..#ifn
2de0: 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69  def NDEBUG.#defi
2df0: 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  ne WINMEM_MAGIC1
2e00: 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a       0x42b2830b.
2e10: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
2e20: 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34 64  AGIC2     0xbd4d
2e30: 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74 61  7cf4.#endif..sta
2e40: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65  tic struct winMe
2e50: 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61  mData win_mem_da
2e60: 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e  ta = {.#ifndef N
2e70: 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d  DEBUG.  WINMEM_M
2e80: 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20 20  AGIC1,.#endif.  
2e90: 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66 6e  NULL, FALSE.#ifn
2ea0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57 49  def NDEBUG.  ,WI
2eb0: 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e 64  NMEM_MAGIC2.#end
2ec0: 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  if.};..#ifndef N
2ed0: 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69  DEBUG.#define wi
2ee0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31  nMemAssertMagic1
2ef0: 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d  () assert( win_m
2f00: 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d 3d  em_data.magic1==
2f10: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 0a  WINMEM_MAGIC1 ).
2f20: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2f30: 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73 73  sertMagic2() ass
2f40: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
2f50: 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  a.magic2==WINMEM
2f60: 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69 6e  _MAGIC2 ).#defin
2f70: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2f80: 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73 73  gic()  winMemAss
2f90: 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69 6e  ertMagic1(); win
2fa0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28  MemAssertMagic2(
2fb0: 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  );.#else.#define
2fc0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2fd0: 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65  ic().#endif..#de
2fe0: 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44 61  fine winMemGetDa
2ff0: 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d 65  taPtr()  &win_me
3000: 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20 77  m_data.#define w
3010: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 20  inMemGetHeap()  
3020: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
3030: 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77 69  hHeap.#define wi
3040: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 20  nMemGetOwned()  
3050: 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 62    win_mem_data.b
3060: 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76 6f  Owned..static vo
3070: 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63  id *winMemMalloc
3080: 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74  (int nBytes);.st
3090: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
30a0: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
30b0: 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  r);.static void 
30c0: 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76  *winMemRealloc(v
30d0: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
30e0: 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63   nBytes);.static
30f0: 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28   int winMemSize(
3100: 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63  void *p);.static
3110: 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64   int winMemRound
3120: 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69  up(int n);.stati
3130: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74  c int winMemInit
3140: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
3150: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
3160: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69  nMemShutdown(voi
3170: 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63  d *pAppData);..c
3180: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
3190: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
31a0: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
31b0: 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  d);.#endif /* SQ
31c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
31d0: 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  C */../*.** The 
31e0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
31f0: 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29  le is (normally)
3200: 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65   set once and ne
3210: 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74  ver changes.** t
3220: 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72  hereafter.  It r
3230: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74  ecords whether t
3240: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
3250: 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20  tem is Win9x.** 
3260: 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  or WinNT..**.** 
3270: 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  0:   Operating s
3280: 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a  ystem unknown..*
3290: 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 1:   Operating
32a0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78   system is Win9x
32b0: 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74  ..** 2:   Operat
32c0: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
32d0: 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  nNT..**.** In or
32e0: 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74  der to facilitat
32f0: 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57  e testing on a W
3300: 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65  inNT system, the
3310: 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a   test fixture.**
3320: 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65   can manually se
3330: 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  t this value to 
3340: 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e  1 to emulate Win
3350: 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  98 behavior..*/.
3360: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3370: 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57  ST.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 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
33b0: 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e 33  LONG SQLITE_WIN3
33c0: 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74  2_VOLATILE sqlit
33d0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
33e0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
33f0: 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e  SYSCALL.#  defin
3400: 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65  e SYSCALL sqlite
3410: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65  3_syscall_ptr.#e
3420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
3430: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
3440: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69   available on Wi
3450: 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52  ndows CE or WinR
3460: 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  T.. */..#if SQLI
3470: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
3480: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
3490: 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69    define osAreFi
34a0: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20 20  leApisANSI()    
34b0: 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a     1.#endif../*.
34c0: 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63  ** Many system c
34d0: 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65  alls are accesse
34e0: 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65  d through pointe
34f0: 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73  r-to-functions s
3500: 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d  o that.** they m
3510: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
3520: 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66   at runtime to f
3530: 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20  acilitate fault 
3540: 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67  injection during
3550: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
3560: 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65  sandboxing.  The
3570: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79   following array
3580: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73   holds the names
3590: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a   and pointers.**
35a0: 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65   to all override
35b0: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
35c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  s..*/.static str
35d0: 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20  uct win_syscall 
35e0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
35f0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
3600: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3610: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
3620: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
3630: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
3640: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
3650: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3660: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3670: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
3680: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
3690: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
36a0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20  scall[] = {.#if 
36b0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
36c0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
36d0: 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c  INRT.  { "AreFil
36e0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
36f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65      (SYSCALL)Are
3700: 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20  FileApisANSI,   
3710: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3720: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
3730: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
3740: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3770: 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65  ifndef osAreFile
3780: 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65  ApisANSI.#define
3790: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
37a0: 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  SI ((BOOL(WINAPI
37b0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
37c0: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  l[0].pCurrent).#
37d0: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
37e0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
37f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3800: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3810: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
3820: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3830: 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c  CALL)CharLowerW,
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3850: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3860: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
3870: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3880: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3890: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
38a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
38b0: 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50  sCharLowerW ((LP
38c0: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
38d0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
38e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
38f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3900: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3910: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3920: 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  E).  { "CharUppe
3930: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3940: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55    (SYSCALL)CharU
3950: 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  pperW,          
3960: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3970: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
3990: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
39c0: 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72  fine osCharUpper
39d0: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
39e0: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
39f0: 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74  call[2].pCurrent
3a00: 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e  )..  { "CloseHan
3a10: 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  dle",           
3a20: 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65    (SYSCALL)Close
3a30: 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20  Handle,         
3a40: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
3a50: 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20  e osCloseHandle 
3a60: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3a70: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3a80: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [3].pCurrent)..#
3a90: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3aa0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3ab0: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
3ac0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
3ad0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3ae0: 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20  FileA,          
3af0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3b00: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3b20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3b40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3b50: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
3b60: 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  A ((HANDLE(WINAP
3b70: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
3b80: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3b90: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3ba0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3bb0: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3bc0: 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74  call[4].pCurrent
3bd0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3be0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3bf0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3c00: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3c10: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
3c20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3c30: 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20  L)CreateFileW,  
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
3c60: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
3c70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ca0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
3cb0: 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44  eateFileW ((HAND
3cc0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
3cd0: 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  STR,DWORD,DWORD,
3ce0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
3cf0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
3d00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e  ,DWORD,DWORD,HAN
3d10: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  DLE))aSyscall[5]
3d20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3d30: 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  (!SQLITE_OS_WINR
3d40: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3d50: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3d60: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
3d70: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
3d80: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3d90: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3da0: 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65  IZE>0)).  { "Cre
3db0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
3dc0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3dd0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3de0: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
3df0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3e00: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
3e10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3e50: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28  teFileMappingA (
3e60: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3e70: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
3e80: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3e90: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
3ea0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54  WORD,DWORD,LPCST
3eb0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  R))aSyscall[6].p
3ec0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3ed0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3ee0: 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e   (!SQLITE_OS_WIN
3ef0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3f00: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3f10: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
3f20: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
3f30: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
3f40: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
3f50: 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 43 72  SIZE>0)).  { "Cr
3f60: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3f70: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3f80: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
3f90: 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  ngW,      0 },.#
3fa0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3fb0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
3fc0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ff0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
4000: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20  ateFileMappingW 
4010: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4020: 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52  )(HANDLE,LPSECUR
4030: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
4040: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
4050: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57  DWORD,DWORD,LPCW
4060: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d  STR))aSyscall[7]
4070: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4080: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4090: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
40a0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
40b0: 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  E).  { "CreateMu
40c0: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
40d0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
40e0: 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20  eMutexW,        
40f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4100: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
4110: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4120: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4150: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74  fine osCreateMut
4160: 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  exW ((HANDLE(WIN
4170: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
4180: 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c  _ATTRIBUTES,BOOL
4190: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57  , \.        LPCW
41a0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  STR))aSyscall[8]
41b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
41c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
41d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
41e0: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
41f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4200: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
4210: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
4220: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4230: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
4240: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4250: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4270: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4280: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28   osDeleteFileA (
4290: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
42a0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
42b0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
42c0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
42d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
42e0: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
42f0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
4300: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
4310: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
4320: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4330: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
4340: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4350: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4370: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4380: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57  ne osDeleteFileW
4390: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
43a0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
43b0: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
43c0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
43d0: 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54  WINCE.  { "FileT
43e0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
43f0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69  me", (SYSCALL)Fi
4400: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
4410: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
4420: 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  e.  { "FileTimeT
4430: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4440: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4470: 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69  #define osFileTi
4480: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4490: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
44a0: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
44b0: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
44c0: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
44d0: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
44e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
44f0: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4500: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
4510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c      (SYSCALL)Fil
4520: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
4530: 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  e,    0 },.#else
4540: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4550: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4560: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4590: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
45a0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28  eToSystemTime ((
45b0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
45c0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
45d0: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
45e0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
45f0: 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  12].pCurrent).. 
4600: 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66   { "FlushFileBuf
4610: 66 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53  fers",        (S
4620: 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65  YSCALL)FlushFile
4630: 42 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20  Buffers,        
4640: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4650: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
4660: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4670: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
4680: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
4690: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
46a0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
46b0: 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  SI).  { "FormatM
46c0: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
46d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d     (SYSCALL)Form
46e0: 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20  atMessageA,     
46f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4700: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4710: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
4720: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4750: 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65  efine osFormatMe
4760: 73 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57  ssageA ((DWORD(W
4770: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
4780: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52  CVOID,DWORD,DWOR
4790: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
47a0: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
47b0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  *))aSyscall[14].
47c0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
47d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
47e0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
47f0: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
4800: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
4810: 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73  SCALL)FormatMess
4820: 61 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30  ageW,          0
4830: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4840: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
4850: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4860: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4870: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4880: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4890: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
48a0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
48b0: 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c  )(DWORD,LPCVOID,
48c0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53  DWORD,DWORD,LPWS
48d0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
48e0: 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53  ORD,va_list*))aS
48f0: 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72  yscall[15].pCurr
4900: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4910: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
4920: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
4930: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
4940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4950: 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61  YSCALL)FreeLibra
4960: 72 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ry,             
4970: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4980: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
4990: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
49a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
49c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
49d0: 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28   osFreeLibrary (
49e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
49f0: 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c  MODULE))aSyscall
4a00: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
4a10: 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50    { "GetCurrentP
4a20: 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28  rocessId",     (
4a30: 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65  SYSCALL)GetCurre
4a40: 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20  ntProcessId,    
4a50: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
4a60: 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
4a70: 73 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e  ssId ((DWORD(WIN
4a80: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
4a90: 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e  call[17].pCurren
4aa0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4ab0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4ac0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4ad0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4ae0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4af0: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
4b00: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
4b10: 61 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceA,       0 },
4b20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
4b30: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
4b40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4b70: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4b80: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4b90: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4ba0: 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c  (LPCSTR,LPDWORD,
4bb0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4bc0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f   \.        LPDWO
4bd0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d  RD))aSyscall[18]
4be0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4bf0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4c00: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
4c10: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4c20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4c30: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44  _WIDE).  { "GetD
4c40: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
4c50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4c60: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c70: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
4c80: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
4c90: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
4ca0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4cd0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
4ce0: 73 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42  skFreeSpaceW ((B
4cf0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4d00: 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WSTR,LPDWORD,LPD
4d10: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
4d20: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
4d30: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
4d40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4d50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4d60: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4d70: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4d80: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
4d90: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
4da0: 62 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d  butesA,      0 }
4db0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4dc0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
4dd0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4de0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4df0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4e00: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4e10: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4e20: 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  sA ((DWORD(WINAP
4e30: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4e40: 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e  call[20].pCurren
4e50: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4e60: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4e70: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4e80: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4e90: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4ea0: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
4eb0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4ec0: 75 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c  utesW,      0 },
4ed0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4ee0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
4ef0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4f00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4f20: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4f30: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4f40: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4f50: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
4f60: 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e  call[21].pCurren
4f70: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4f80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4f90: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
4fa0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4fb0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ",    (SYSCALL)G
4fc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4fd0: 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ExW,    0 },.#el
4fe0: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
4ff0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
5000: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5030: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5040: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20  leAttributesExW 
5050: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5060: 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45  LPCWSTR,GET_FILE
5070: 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20  EX_INFO_LEVELS, 
5080: 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44  \.        LPVOID
5090: 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70  ))aSyscall[22].p
50a0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
50b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
50c0: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
50d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
50e0: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69  YSCALL)GetFileSi
50f0: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
5100: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5110: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
5120: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5130: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5140: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5150: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5160: 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28   osGetFileSize (
5170: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5180: 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29  HANDLE,LPDWORD))
5190: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
51a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
51b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
51c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
51d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
51e0: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
51f0: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
5200: 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61  YSCALL)GetFullPa
5210: 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20  thNameA,        
5220: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5230: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5240: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5250: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5270: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5280: 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
5290: 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  meA ((DWORD(WINA
52a0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
52b0: 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20  D,LPSTR, \.     
52c0: 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63     LPSTR*))aSysc
52d0: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
52e0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
52f0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
5300: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5320: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
5330: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5340: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
5350: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
5360: 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30  hNameW,        0
5370: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5380: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
5390: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
53a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
53b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
53c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
53d0: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
53e0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
53f0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
5400: 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20  D,LPWSTR, \.    
5410: 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79      LPWSTR*))aSy
5420: 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65  scall[25].pCurre
5430: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73  nt)..  { "GetLas
5440: 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20  tError",        
5450: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5460: 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
5470: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5480: 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ine osGetLastErr
5490: 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  or ((DWORD(WINAP
54a0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
54b0: 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[26].pCurrent)
54c0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
54d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
54e0: 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53  EXTENSION).#if S
54f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
5500: 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41   /* The GetProcA
5510: 64 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e  ddressA() routin
5520: 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
5530: 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  ble on Windows C
5540: 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72  E. */.  { "GetPr
5550: 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20  ocAddressA",    
5560: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5570: 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20  tProcAddressA,  
5580: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5590: 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72  e.  /* All other
55a0: 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72   Windows platfor
55b0: 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f  ms expect GetPro
55c0: 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61  cAddress() to ta
55d0: 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20  ke.  ** an ANSI 
55e0: 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73  string regardles
55f0: 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44  s of the _UNICOD
5600: 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b  E setting */.  {
5610: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
5620: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
5630: 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72  CALL)GetProcAddr
5640: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20  ess,          0 
5650: 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  },.#endif.#else.
5660: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
5670: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
5680: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
56b0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
56c0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
56d0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
56e0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
56f0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
5700: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
5710: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5720: 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  RT.  { "GetSyste
5730: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
5740: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
5750: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
5760: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5770: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
5780: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
5790: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
57c0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
57d0: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
57e0: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e  PI*)(LPSYSTEM_IN
57f0: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d  FO))aSyscall[28]
5800: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5810: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c  "GetSystemTime",
5820: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5830: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
5840: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
5850: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
5860: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49  SystemTime ((VOI
5870: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
5880: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
5890: 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[29].pCurrent).
58a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
58b0: 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79  WINCE.  { "GetSy
58c0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
58d0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  me", (SYSCALL)Ge
58e0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
58f0: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
5900: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
5910: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
5920: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5950: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
5960: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5970: 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  e ((VOID(WINAPI*
5980: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  )( \.        LPF
5990: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
59a0: 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[30].pCurrent).
59b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
59c0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
59d0: 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  SI).  { "GetTemp
59e0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
59f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5a00: 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20  empPathA,       
5a10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5a20: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5a30: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
5a40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5a70: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
5a80: 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e  athA ((DWORD(WIN
5a90: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54  API*)(DWORD,LPST
5aa0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e  R))aSyscall[31].
5ab0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5ac0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
5ad0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5ae0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
5af0: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
5b00: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
5b10: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
5b20: 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20  pPathW,         
5b30: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5b40: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
5b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5b60: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b80: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5b90: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
5ba0: 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hW ((DWORD(WINAP
5bb0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52  I*)(DWORD,LPWSTR
5bc0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70  ))aSyscall[32].p
5bd0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5be0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5bf0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
5c00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5c10: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
5c20: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
5c30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5c40: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
5c50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5c60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5c80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5c90: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20   osGetTickCount 
5ca0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5cb0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5cc0: 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  33].pCurrent)..#
5cd0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5ce0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5cf0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
5d00: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5d10: 53 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20  SIONEX) && \.   
5d20: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
5d30: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20  2_GETVERSIONEX. 
5d40: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
5d50: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
5d60: 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f  YSCALL)GetVersio
5d70: 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20  nExA,           
5d80: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5d90: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
5da0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5db0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5dd0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5de0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
5df0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5e00: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53  ( \.        LPOS
5e10: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53  VERSIONINFOA))aS
5e20: 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72  yscall[34].pCurr
5e30: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5e40: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5e50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5e60: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
5e70: 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  \.        define
5e80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
5e90: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20  ETVERSIONEX) && 
5ea0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5eb0: 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47  VERSIONEX.  { "G
5ec0: 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20  etVersionExW",  
5ed0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ee0: 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c  L)GetVersionExW,
5ef0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5f00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65  #else.  { "GetVe
5f10: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20  rsionExW",      
5f20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5f50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5f60: 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f  tVersionExW ((BO
5f70: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5f80: 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49         LPOSVERSI
5f90: 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c  ONINFOW))aSyscal
5fa0: 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[35].pCurrent).
5fb0: 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22  .  { "HeapAlloc"
5fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fd0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c  (SYSCALL)HeapAll
5fe0: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
5ff0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
6000: 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50  osHeapAlloc ((LP
6010: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
6020: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
6030: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6040: 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72  yscall[36].pCurr
6050: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6060: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6070: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
6080: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6090: 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20  LL)HeapCreate,  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
60b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
60c0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
60d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
60e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
60f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6100: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6110: 65 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44  eapCreate ((HAND
6120: 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  LE(WINAPI*)(DWOR
6130: 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20  D,SIZE_T, \.    
6140: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6150: 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e  call[37].pCurren
6160: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6170: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
6180: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
6190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
61a0: 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20  )HeapDestroy,   
61b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
61c0: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65  else.  { "HeapDe
61d0: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
61e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6210: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
6220: 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28  pDestroy ((BOOL(
6230: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
6240: 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43  )aSyscall[38].pC
6250: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
6260: 61 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  apFree",        
6270: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6280: 29 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20  )HeapFree,      
6290: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
62a0: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72  #define osHeapFr
62b0: 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  ee ((BOOL(WINAPI
62c0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
62d0: 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  LPVOID))aSyscall
62e0: 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [39].pCurrent)..
62f0: 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63    { "HeapReAlloc
6300: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6310: 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c  SYSCALL)HeapReAl
6320: 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  loc,            
6330: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6340: 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c  sHeapReAlloc ((L
6350: 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48  PVOID(WINAPI*)(H
6360: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
6370: 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  ID, \.        SI
6380: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34  ZE_T))aSyscall[4
6390: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
63a0: 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20  { "HeapSize",   
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
63c0: 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20  SCALL)HeapSize, 
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
63e0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
63f0: 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54  eapSize ((SIZE_T
6400: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6410: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6420: 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63    LPCVOID))aSysc
6430: 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74  all[41].pCurrent
6440: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6450: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6460: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
6470: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6480: 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20  HeapValidate,   
6490: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
64a0: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  lse.  { "HeapVal
64b0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
64c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
64f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6500: 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28  Validate ((BOOL(
6510: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6520: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6530: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6540: 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[42].pCurrent)
6550: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6560: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6570: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6580: 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20  HeapCompact",   
6590: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65a0: 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  LL)HeapCompact, 
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
65c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
65d0: 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20  Compact",       
65e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
65f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6610: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6620: 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e  eapCompact ((UIN
6630: 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  T(WINAPI*)(HANDL
6640: 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  E,DWORD))aSyscal
6650: 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[43].pCurrent).
6660: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6680: 53 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  SI) && !defined(
6690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
66a0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
66b0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
66c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
66d0: 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41  ALL)LoadLibraryA
66e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
66f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6700: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
6710: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6720: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6730: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6740: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6750: 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48  LoadLibraryA ((H
6760: 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28  MODULE(WINAPI*)(
6770: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
6780: 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [44].pCurrent)..
6790: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
67a0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
67b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
67c0: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
67d0: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
67e0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
67f0: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
6800: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
6810: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6820: 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20  )LoadLibraryW,  
6830: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6840: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
6850: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6860: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6890: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
68a0: 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44  dLibraryW ((HMOD
68b0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
68c0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  WSTR))aSyscall[4
68d0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
68e0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
68f0: 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65  RT.  { "LocalFre
6900: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6910: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c    (SYSCALL)Local
6920: 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Free,           
6930: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6940: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6960: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6980: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6990: 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65  fine osLocalFree
69a0: 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49   ((HLOCAL(WINAPI
69b0: 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63  *)(HLOCAL))aSysc
69c0: 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74  all[46].pCurrent
69d0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
69e0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
69f0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6a00: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
6a10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6a20: 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20  ALL)LockFile,   
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a40: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63  ,.#else.  { "Loc
6a50: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6a60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6a70: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6a80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6a90: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
6aa0: 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  LockFile.#define
6ab0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f   osLockFile ((BO
6ac0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6ad0: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
6ae0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6af0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6b00: 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  47].pCurrent).#e
6b10: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
6b20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
6b30: 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  LockFileEx",    
6b40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6b50: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  LL)LockFileEx,  
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6b70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6b80: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
6b90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6bb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6bc0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6bd0: 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e  ockFileEx.#defin
6be0: 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28  e osLockFileEx (
6bf0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6c00: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52  ANDLE,DWORD,DWOR
6c10: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
6c20: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
6c30: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
6c40: 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  48].pCurrent).#e
6c50: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
6c60: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
6c70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
6c80: 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65  & \.        (!de
6c90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ca0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
6cb0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
6cc0: 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  )).  { "MapViewO
6cd0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
6ce0: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
6cf0: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
6d00: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6d10: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6d20: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6d30: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6d60: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
6d70: 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49  File ((LPVOID(WI
6d80: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6d90: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6da0: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6db0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e  T))aSyscall[49].
6dc0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6dd0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
6de0: 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41  har",     (SYSCA
6df0: 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  LL)MultiByteToWi
6e00: 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c  deChar,     0 },
6e10: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74  ..#define osMult
6e20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20  iByteToWideChar 
6e30: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
6e40: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  INT,DWORD,LPCSTR
6e50: 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  ,int,LPWSTR, \. 
6e60: 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73         int))aSys
6e70: 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e  call[50].pCurren
6e80: 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65  t)..  { "QueryPe
6e90: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
6ea0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72  ", (SYSCALL)Quer
6eb0: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
6ec0: 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ter, 0 },..#defi
6ed0: 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72  ne osQueryPerfor
6ee0: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42  manceCounter ((B
6ef0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
6f00: 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e          LARGE_IN
6f10: 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c  TEGER*))aSyscall
6f20: 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [51].pCurrent)..
6f30: 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20    { "ReadFile", 
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6f50: 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65  SYSCALL)ReadFile
6f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6f70: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6f80: 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c  sReadFile ((BOOL
6f90: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6fa0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50  ,LPVOID,DWORD,LP
6fb0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6fc0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
6fd0: 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72  Syscall[52].pCur
6fe0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45  rent)..  { "SetE
6ff0: 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ndOfFile",      
7000: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
7010: 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20  etEndOfFile,    
7020: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
7030: 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66  efine osSetEndOf
7040: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7050: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
7060: 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65  scall[53].pCurre
7070: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7080: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
7090: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20  etFilePointer", 
70a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
70b0: 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  L)SetFilePointer
70c0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
70d0: 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69  #else.  { "SetFi
70e0: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
70f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7120: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  if..#define osSe
7130: 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44  tFilePointer ((D
7140: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7150: 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c  NDLE,LONG,PLONG,
7160: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
7170: 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70  ))aSyscall[54].p
7180: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
7190: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
71a0: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
71c0: 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20  YSCALL)Sleep,   
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
71f0: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
7200: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7210: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7220: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7230: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7240: 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28   osSleep ((VOID(
7250: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29  WINAPI*)(DWORD))
7260: 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75  aSyscall[55].pCu
7270: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73  rrent)..  { "Sys
7280: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
7290: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
72a0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
72b0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23  Time,    0 },..#
72c0: 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54  define osSystemT
72d0: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28  imeToFileTime ((
72e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
72f0: 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c  NST SYSTEMTIME*,
7300: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
7310: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
7320: 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  56].pCurrent)..#
7330: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7340: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
7350: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c  S_WINRT.  { "Unl
7360: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
7370: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7380: 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  UnlockFile,     
7390: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
73a0: 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  lse.  { "UnlockF
73b0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
73c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
73f0: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f  ..#ifndef osUnlo
7400: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
7410: 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f  sUnlockFile ((BO
7420: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7430: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
7440: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7450: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7460: 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  57].pCurrent).#e
7470: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
7480: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
7490: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20  UnlockFileEx",  
74a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
74b0: 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c  LL)UnlockFileEx,
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
74d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
74e0: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
74f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7510: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7520: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55  dif..#define osU
7530: 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  nlockFileEx ((BO
7540: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7550: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
7560: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7570: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7580: 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72  yscall[58].pCurr
7590: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
75a0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65  _OS_WINCE || !de
75b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
75c0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
75d0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
75e0: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
75f0: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
7600: 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69  (SYSCALL)UnmapVi
7610: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
7620: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7630: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
7640: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
7650: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7670: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7680: 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66  ne osUnmapViewOf
7690: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
76a0: 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53  PI*)(LPCVOID))aS
76b0: 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72  yscall[59].pCurr
76c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43  ent)..  { "WideC
76d0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c  harToMultiByte",
76e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69       (SYSCALL)Wi
76f0: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
7700: 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  e,     0 },..#de
7710: 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54  fine osWideCharT
7720: 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74  oMultiByte ((int
7730: 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44  (WINAPI*)(UINT,D
7740: 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74  WORD,LPCWSTR,int
7750: 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20  ,LPSTR,int, \.  
7760: 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42        LPCSTR,LPB
7770: 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30  OOL))aSyscall[60
7780: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7790: 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20   "WriteFile",   
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
77b0: 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20  CALL)WriteFile, 
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
77d0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72  },..#define osWr
77e0: 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  iteFile ((BOOL(W
77f0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7800: 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  PCVOID,DWORD,LPD
7810: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7820: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7830: 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72  yscall[61].pCurr
7840: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7850: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43  _OS_WINRT.  { "C
7860: 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20  reateEventExW", 
7870: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7880: 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  L)CreateEventExW
7890: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
78a0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
78b0: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
78c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
78f0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
7900: 65 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48  eateEventExW ((H
7910: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
7920: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
7930: 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a  UTES,LPCWSTR, \.
7940: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
7950: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32  ORD))aSyscall[62
7960: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7970: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
7980: 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  T.  { "WaitForSi
7990: 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20  ngleObject",    
79a0: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
79b0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20  rSingleObject,  
79c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
79d0: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
79e0: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
79f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7a10: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7a20: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
7a30: 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52  gleObject ((DWOR
7a40: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7a50: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  E, \.        DWO
7a60: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d  RD))aSyscall[63]
7a70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7a80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7a90: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7aa0: 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20  gleObjectEx",   
7ab0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7ac0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20  SingleObjectEx, 
7ad0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7ae0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7af0: 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53  bjectEx",   (SYS
7b00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7b20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7b30: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7b40: 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f  leObjectEx ((DWO
7b50: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
7b60: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
7b70: 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61      BOOL))aSysca
7b80: 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[64].pCurrent)
7b90: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7ba0: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
7bb0: 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20  lePointerEx",   
7bc0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7bd0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20  tFilePointerEx, 
7be0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7bf0: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
7c00: 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20  interEx",       
7c10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7c40: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
7c50: 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f  ePointerEx ((BOO
7c60: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7c70: 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c  E,LARGE_INTEGER,
7c80: 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47   \.        PLARG
7c90: 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29  E_INTEGER,DWORD)
7ca0: 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43  )aSyscall[65].pC
7cb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7cc0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7cd0: 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61   "GetFileInforma
7ce0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c  tionByHandleEx",
7cf0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c   (SYSCALL)GetFil
7d00: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7d10: 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c  ndleEx, 0 },.#el
7d20: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  se.  { "GetFileI
7d30: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7d40: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
7d50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7d60: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7d70: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
7d80: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7d90: 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  andleEx ((BOOL(W
7da0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
7db0: 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49  \.        FILE_I
7dc0: 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c  NFO_BY_HANDLE_CL
7dd0: 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44  ASS,LPVOID,DWORD
7de0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70  ))aSyscall[66].p
7df0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7e00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
7e10: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
7e20: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
7e30: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
7e40: 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56  IZE>0).  { "MapV
7e50: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
7e60: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ",    (SYSCALL)M
7e70: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
7e80: 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  App,    0 },.#el
7e90: 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  se.  { "MapViewO
7ea0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
7eb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7ee0: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69  .#define osMapVi
7ef0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20  ewOfFileFromApp 
7f00: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
7f10: 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55  )(HANDLE,ULONG,U
7f20: 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20  LONG64, \.      
7f30: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
7f40: 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[67].pCurrent)
7f50: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7f60: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
7f70: 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20  eFile2",        
7f80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
7f90: 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20  eateFile2,      
7fa0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7fb0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
7fc0: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
7fd0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8000: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
8010: 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57  File2 ((HANDLE(W
8020: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
8030: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
8040: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
8050: 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
8060: 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29  DED_PARAMETERS))
8070: 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75  aSyscall[68].pCu
8080: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8090: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
80a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
80b0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
80c0: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63  ON).  { "LoadPac
80d0: 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20  kagedLibrary",  
80e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
80f0: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c  PackagedLibrary,
8100: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8110: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
8120: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
8130: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8160: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b  efine osLoadPack
8170: 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d  agedLibrary ((HM
8180: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
8190: 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  PCWSTR, \.      
81a0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
81b0: 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[69].pCurrent).
81c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
81d0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63  INRT.  { "GetTic
81e0: 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20  kCount64",      
81f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8200: 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20  TickCount64,    
8210: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8220: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
8230: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
8240: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8270: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b  define osGetTick
8280: 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c  Count64 ((ULONGL
8290: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ONG(WINAPI*)(VOI
82a0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e  D))aSyscall[70].
82b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
82c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
82d0: 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73   { "GetNativeSys
82e0: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53  temInfo",     (S
82f0: 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65  YSCALL)GetNative
8300: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
8310: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8320: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
8330: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
8340: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8350: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8360: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8370: 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
8380: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
8390: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
83a0: 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29    LPSYSTEM_INFO)
83b0: 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43  )aSyscall[71].pC
83c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
83d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
83e0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
83f0: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8400: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
8410: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8420: 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d  tringA,      0 }
8430: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
8440: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
8450: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8460: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8470: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8480: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8490: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
84a0: 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gA ((VOID(WINAPI
84b0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
84c0: 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74  all[72].pCurrent
84d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
84e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
84f0: 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75  WIDE).  { "Outpu
8500: 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20  tDebugStringW", 
8510: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
8520: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
8530: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
8540: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
8550: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
8560: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8590: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
85a0: 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56  DebugStringW ((V
85b0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
85c0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  WSTR))aSyscall[7
85d0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
85e0: 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61  { "GetProcessHea
85f0: 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  p",          (SY
8600: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73  SCALL)GetProcess
8610: 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  Heap,          0
8620: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
8630: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28  etProcessHeap ((
8640: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
8650: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
8660: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
8670: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8680: 54 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53  T && (!defined(S
8690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
86a0: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
86b0: 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22  AP_SIZE>0).  { "
86c0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
86d0: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
86e0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61  ALL)CreateFileMa
86f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20  ppingFromApp, 0 
8700: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
8710: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8720: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
8730: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8740: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8750: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8760: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
8770: 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44  ngFromApp ((HAND
8780: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
8790: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
87a0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
87b0: 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  TES,ULONG,ULONG6
87c0: 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  4,LPCWSTR))aSysc
87d0: 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74  all[75].pCurrent
87e0: 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f  )../*.** NOTE: O
87f0: 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66  n some sub-platf
8800: 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c  orms, the Interl
8810: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8820: 61 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a  ange "function".
8830: 2a 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c  **       is real
8840: 6c 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20  ly just a macro 
8850: 74 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70  that uses a comp
8860: 69 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28  iler intrinsic (
8870: 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20  e.g. x64)..**   
8880: 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72      So do not tr
8890: 79 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69  y to make this i
88a0: 73 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e  s into a redefin
88b0: 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a  able interface..
88c0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49  */.#if defined(I
88d0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
88e0: 65 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22  eExchange).  { "
88f0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
8900: 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59  reExchange", (SY
8910: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8920: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8930: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65  ..#define osInte
8940: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8950: 63 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b  change Interlock
8960: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
8970: 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74  e.#else.  { "Int
8980: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
8990: 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41  xchange", (SYSCA
89a0: 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  LL)InterlockedCo
89b0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30  mpareExchange, 0
89c0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49   },..#define osI
89d0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
89e0: 65 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47  eExchange ((LONG
89f0: 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c  (WINAPI*)(LONG \
8a00: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8a10: 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c  WIN32_VOLATILE*,
8a20: 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73   LONG,LONG))aSys
8a30: 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e  call[76].pCurren
8a40: 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  t).#endif /* def
8a50: 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64  ined(Interlocked
8a60: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29  CompareExchange)
8a70: 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
8a80: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
8a90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
8aa0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53   SQLITE_WIN32_US
8ab0: 45 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64  E_UUID.  { "Uuid
8ac0: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
8ad0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8ae0: 55 75 69 64 43 72 65 61 74 65 2c 20 20 20 20 20  UuidCreate,     
8af0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8b00: 73 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  se.  { "UuidCrea
8b10: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
8b20: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8b50: 0a 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43  .#define osUuidC
8b60: 72 65 61 74 65 20 28 28 52 50 43 5f 53 54 41 54  reate ((RPC_STAT
8b70: 55 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55  US(RPC_ENTRY*)(U
8b80: 55 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37  UID*))aSyscall[7
8b90: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
8ba0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
8bb0: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
8bc0: 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
8bd0: 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a  _WIN32_USE_UUID.
8be0: 20 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53    { "UuidCreateS
8bf0: 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20  equential",     
8c00: 28 53 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65  (SYSCALL)UuidCre
8c10: 61 74 65 53 65 71 75 65 6e 74 69 61 6c 2c 20 20  ateSequential,  
8c20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8c30: 22 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  "UuidCreateSeque
8c40: 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53  ntial",     (SYS
8c50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8c70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8c80: 65 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65  e osUuidCreateSe
8c90: 71 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20  quential \.     
8ca0: 20 20 20 28 28 52 50 43 5f 53 54 41 54 55 53 28     ((RPC_STATUS(
8cb0: 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44  RPC_ENTRY*)(UUID
8cc0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e  *))aSyscall[78].
8cd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
8ce0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
8cf0: 4f 5f 53 59 4e 43 29 20 26 26 20 53 51 4c 49 54  O_SYNC) && SQLIT
8d00: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
8d10: 30 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77  0.  { "FlushView
8d20: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
8d30: 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68    (SYSCALL)Flush
8d40: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
8d50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8d60: 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69  { "FlushViewOfFi
8d70: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  le",          (S
8d80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8da0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8db0: 69 6e 65 20 6f 73 46 6c 75 73 68 56 69 65 77 4f  ine osFlushViewO
8dc0: 66 46 69 6c 65 20 5c 0a 20 20 20 20 20 20 20 20  fFile \.        
8dd0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
8de0: 4c 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29  LPCVOID,SIZE_T))
8df0: 61 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75  aSyscall[79].pCu
8e00: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
8e10: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
8e20: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
8e30: 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ls */../*.** Thi
8e40: 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73  s is the xSetSys
8e50: 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64  temCall() method
8e60: 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20   of sqlite3_vfs 
8e70: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  for all of the.*
8e80: 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e  * "win32" VFSes.
8e90: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
8ea0: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
8eb0: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
8ec0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
8ed0: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
8ee0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
8ef0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
8f00: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
8f10: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
8f20: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
8f30: 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43  nt winSetSystemC
8f40: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
8f50: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20  fs *pNotUsed,   
8f60: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8f70: 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73  pointer.  Not us
8f80: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
8f90: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
8fa0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8fb0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
8fc0: 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71  override */.  sq
8fd0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8fe0: 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50  r pNewFunc  /* P
8ff0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79  ointer to new sy
9000: 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20  stem call value 
9010: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
9020: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
9030: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55   = SQLITE_NOTFOU
9040: 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ND;..  UNUSED_PA
9050: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
9060: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
9070: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  0 ){.    /* If n
9080: 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e  o zName is given
9090: 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79  , restore all sy
90a0: 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68  stem calls to th
90b0: 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20  eir default.    
90c0: 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20  ** settings and 
90d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20  return NULL.    
90e0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
90f0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69  TE_OK;.    for(i
9100: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
9110: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9120: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9130: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73  {.      if( aSys
9140: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
9150: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73   ){.        aSys
9160: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9170: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
9180: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d  Default;.      }
9190: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
91a0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
91b0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70  is specified, op
91c0: 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68  erate on only th
91d0: 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c  e one system cal
91e0: 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69  l.    ** specifi
91f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
9200: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
9210: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
9220: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
9230: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9240: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
9250: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
9260: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
9270: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
9280: 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20  Default==0 ){.  
9290: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
92a0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61  [i].pDefault = a
92b0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
92c0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ent;.        }. 
92d0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
92e0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  TE_OK;.        i
92f0: 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29  f( pNewFunc==0 )
9300: 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73   pNewFunc = aSys
9310: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
9320: 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  ;.        aSysca
9330: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
9340: 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20   pNewFunc;.     
9350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9360: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
9370: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9380: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
9390: 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63  ue of a system c
93a0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
93b0: 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  L if zName is no
93c0: 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65  t a.** recognize
93d0: 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  d system call na
93e0: 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73  me.  NULL is als
93f0: 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
9400: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a  e system call.**
9410: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
9420: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
9430: 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  ic sqlite3_sysca
9440: 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73  ll_ptr winGetSys
9450: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
9460: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
9470: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9480: 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67  zName.){.  unsig
9490: 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e  ned int i;..  UN
94a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
94b0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28  NotUsed);.  for(
94c0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
94d0: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
94e0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
94f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
9500: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
9510: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
9520: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
9530: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
9540: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9560: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
9570: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rst system call 
9580: 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66  after zName.  If
9590: 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20   zName==NULL.** 
95a0: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
95b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73  name of the firs
95c0: 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  t system call.  
95d0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
95e0: 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c  Name.** is the l
95f0: 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  ast system call 
9600: 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  or if zName is n
9610: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
9620: 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d   valid.** system
9630: 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
9640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e   const char *win
9650: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
9660: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
9670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9680: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
9690: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
96a0: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
96b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
96c0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
96d0: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
96e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
96f0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
9700: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
9710: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
9720: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
9730: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
9740: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
9750: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
9760: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
9770: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
9780: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
9790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
97a0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
97b0: 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20  MALLOC./*.** If 
97c0: 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  a Win32 native h
97d0: 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  eap has been con
97e0: 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75  figured, this fu
97f0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65  nction will atte
9800: 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63  mpt to.** compac
9810: 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63  t it.  Upon succ
9820: 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77  ess, SQLITE_OK w
9830: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
9840: 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20    Upon failure, 
9850: 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45  one.** of SQLITE
9860: 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45  _NOMEM, SQLITE_E
9870: 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RROR, or SQLITE_
9880: 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65  NOTFOUND will be
9890: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a   returned.  The.
98a0: 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61  ** "pnLargest" a
98b0: 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d  rgument, if non-
98c0: 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73  zero, will be us
98d0: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  ed to return the
98e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
98f0: 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65  largest committe
9900: 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20  d free block in 
9910: 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74  the heap, in byt
9920: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
9930: 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74  e3_win32_compact
9940: 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c  _heap(LPUINT pnL
9950: 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  argest){.  int r
9960: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9970: 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d   UINT nLargest =
9980: 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65   0;.  HANDLE hHe
9990: 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  ap;..  winMemAss
99a0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
99b0: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
99c0: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
99d0: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
99e0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
99f0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
9a00: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
9a10: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9a20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9a30: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9a40: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
9a50: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
9a60: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
9a70: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
9a80: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L) );.#endif.#if
9a90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
9aa0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
9ab0: 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61  WINRT.  if( (nLa
9ac0: 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70  rgest=osHeapComp
9ad0: 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54  act(hHeap, SQLIT
9ae0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9af0: 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  GS))==0 ){.    D
9b00: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
9b10: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9b20: 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45  );.    if( lastE
9b30: 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29  rrno==NO_ERROR )
9b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9b50: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9b60: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
9b70: 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61  pCompact (no spa
9b80: 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  ce), heap=%p",. 
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
9bb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9bc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
9bd0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
9be0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52  3_log(SQLITE_ERR
9bf0: 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  OR, "failed to H
9c00: 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75 29  eapCompact (%lu)
9c10: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
9c30: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9c40: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9c50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9c60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9c70: 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  }.#else.  sqlite
9c80: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
9c90: 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20 74  FOUND, "failed t
9ca0: 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 68  o HeapCompact, h
9cb0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
9cc0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9cd0: 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c  eap);.  rc = SQL
9ce0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65  ITE_NOTFOUND;.#e
9cf0: 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61 72  ndif.  if( pnLar
9d00: 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65 73  gest ) *pnLarges
9d10: 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20 20  t = nLargest;.  
9d20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9d30: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
9d40: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
9d50: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
9d60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
9d70: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
9d80: 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63   destroy and rec
9d90: 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74 68  reate it.  If th
9da0: 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68  e Win32 native h
9db0: 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c 61  eap is not isola
9dc0: 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68  ted and/or.** th
9dd0: 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  e sqlite3_memory
9de0: 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f 6e  _used() function
9df0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e   does not return
9e00: 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42 55   zero, SQLITE_BU
9e10: 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65  SY will.** be re
9e20: 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63 68  turned and no ch
9e30: 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
9e40: 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  de to the Win32 
9e50: 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f 0a  native heap..*/.
9e60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
9e70: 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b 0a  2_reset_heap(){.
9e80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54 45    int rc;.  MUTE
9e90: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
9ea0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
9eb0: 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73   ) /* The main s
9ec0: 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20  tatic mutex */. 
9ed0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
9ee0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 65  lite3_mutex *pMe
9ef0: 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20 6d  m; )    /* The m
9f00: 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75 74  emsys static mut
9f10: 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  ex */.  MUTEX_LO
9f20: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
9f30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
9f40: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9f50: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
9f60: 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ).  MUTEX_LOGIC(
9f70: 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
9f80: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
9f90: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9fa0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
9fb0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9fc0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
9fd0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9fe0: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
9ff0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
a000: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a010: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
a020: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
a030: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a040: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
a050: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
a060: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
a070: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
a080: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
a090: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
a0a0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
a0b0: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
a0c0: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
a0d0: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
a0e0: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
a0f0: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
a100: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
a110: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
a120: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
a130: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
a140: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
a150: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
a160: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
a170: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
a180: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
a190: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
a1a0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
a1b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
a1c0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
a1d0: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
a1e0: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
a1f0: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
a200: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
a210: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
a220: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
a230: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
a240: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
a250: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
a260: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
a270: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
a280: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
a290: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a2a0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
a2b0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
a2c0: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
a2d0: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
a2e0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
a2f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
a300: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
a310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a320: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a330: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
a340: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
a350: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a360: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
a370: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
a380: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
a390: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
a3a0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
a3b0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
a3c0: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
a3d0: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
a3e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a3f0: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
a400: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
a410: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
a420: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a430: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a440: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a450: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a460: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
a470: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
a480: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
a490: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
a4a0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
a4b0: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
a4c0: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
a4d0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
a4e0: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
a4f0: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
a500: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
a510: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
a520: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a530: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
a540: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
a550: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a560: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
a570: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
a580: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
a590: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
a5a0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
a5b0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
a5c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
a5d0: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
a5e0: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
a5f0: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a600: 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ZE );.#if define
a610: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a620: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
a630: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
a640: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
a650: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a660: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
a670: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
a680: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
a690: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
a6a0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
a6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
a6c0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
a6d0: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
a6e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a6f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
a700: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
a710: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a720: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a730: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
a740: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a750: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
a760: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
a770: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
a780: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
a790: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
a7a0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
a7b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a7c0: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
a7d0: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
a7e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
a7f0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a800: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
a810: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
a820: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
a830: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
a840: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
a850: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
a860: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
a870: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
a880: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
a890: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
a8a0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
a8b0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
a8c0: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
a8d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
a8e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
a8f0: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
a900: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
a910: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
a920: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
a930: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
a940: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
a950: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
a960: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
a970: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a980: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
a990: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
a9a0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
a9b0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
a9c0: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
a9d0: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
a9e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
a9f0: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
aa00: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
aa10: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
aa20: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
aa30: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
aa40: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
aa70: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
aa80: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
aa90: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
aaa0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
aab0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
aac0: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
aad0: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
aae0: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
aaf0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
ab00: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
ab10: 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21 53  _THREADS>0 && !S
ab20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
ab30: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
ab40: 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  RT && \.        
ab50: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
ab60: 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74 65  E>0.DWORD sqlite
ab70: 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c  3Win32Wait(HANDL
ab80: 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57  E hObject){.  DW
ab90: 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28  ORD rc;.  while(
aba0: 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72   (rc = osWaitFor
abb0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68  SingleObjectEx(h
abc0: 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45  Object, INFINITE
abd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d           TRUE))=
ac00: 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54  =WAIT_IO_COMPLET
ac10: 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e  ION ){}.  return
ac20: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
ac30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
ac40: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
ac50: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
ac60: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
ac70: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
ac80: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
ac90: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
aca0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
acb0: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
acc0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
acd0: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
ace0: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
acf0: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
ad00: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
ad10: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
ad20: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
ad30: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
ad40: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
ad50: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
ad60: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
ad70: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
ad80: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
ad90: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
ada0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
adb0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
adc0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
add0: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
ade0: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
adf0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
ae00: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
ae10: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
ae20: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
ae30: 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  .*/..#if !define
ae40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  d(SQLITE_WIN32_G
ae50: 45 54 56 45 52 53 49 4f 4e 45 58 29 20 7c 7c 20  ETVERSIONEX) || 
ae60: 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  !SQLITE_WIN32_GE
ae70: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66  TVERSIONEX.# def
ae80: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
ae90: 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f  ).#elif SQLITE_O
aea0: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
aeb0: 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64  E_OS_WINRT || !d
aec0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
aed0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20  N32_HAS_ANSI).# 
aee0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
aef0: 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69   (1).#elif !defi
af00: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
af10: 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66  _HAS_WIDE).# def
af20: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30  ine osIsNT()  (0
af30: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
af40: 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c   osIsNT()  ((sql
af50: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29  ite3_os_type==2)
af60: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   || sqlite3_win3
af70: 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69  2_is_nt()).#endi
af80: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
af90: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
afa0: 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65  s if the machine
afb0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65   is running a ve
afc0: 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73  rsion of Windows
afd0: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
afe0: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69   NT kernel..*/.i
aff0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
b000: 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69  _is_nt(void){.#i
b010: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b020: 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  T.  /*.  ** NOTE
b030: 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d  : The WinRT sub-
b040: 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61  platform is alwa
b050: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
b060: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
b070: 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e  .  **       kern
b080: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  el..  */.  retur
b090: 6e 20 31 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  n 1;.#elif defin
b0a0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b0b0: 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26  GETVERSIONEX) &&
b0c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
b0d0: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28  TVERSIONEX.  if(
b0e0: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
b0f0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
b100: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
b110: 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20  0, 0)==0 ){.#if 
b120: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b130: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
b140: 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f     OSVERSIONINFO
b150: 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e  A sInfo;.    sIn
b160: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
b170: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
b180: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65  sInfo);.    osGe
b190: 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e  tVersionExA(&sIn
b1a0: 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72  fo);.    osInter
b1b0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
b1c0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
b1d0: 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  s_type,.        
b1e0: 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72  (sInfo.dwPlatfor
b1f0: 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46  mId == VER_PLATF
b200: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20  ORM_WIN32_NT) ? 
b210: 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66  2 : 1, 0);.#elif
b220: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b230: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
b240: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
b250: 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49  OW sInfo;.    sI
b260: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
b270: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
b280: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47  (sInfo);.    osG
b290: 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49  etVersionExW(&sI
b2a0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65  nfo);.    osInte
b2b0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b2c0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b2d0: 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20  os_type,.       
b2e0: 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f   (sInfo.dwPlatfo
b2f0: 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54  rmId == VER_PLAT
b300: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f  FORM_WIN32_NT) ?
b310: 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64   2 : 1, 0);.#end
b320: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
b330: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
b340: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
b350: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32  lite3_os_type, 2
b360: 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53  , 2)==2;.#elif S
b370: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74  QLITE_TEST.  ret
b380: 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  urn osInterlocke
b390: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
b3a0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
b3b0: 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c  e, 2, 2)==2;.#el
b3c0: 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  se.  /*.  ** NOT
b3d0: 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66  E: All sub-platf
b3e0: 6f 72 6d 73 20 77 68 65 72 65 20 74 68 65 20 47  orms where the G
b3f0: 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20  etVersionEx[AW] 
b400: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20  functions are.  
b410: 2a 2a 20 20 20 20 20 20 20 64 65 70 72 65 63 61  **       depreca
b420: 74 65 64 20 61 72 65 20 61 6c 77 61 79 73 20 61  ted are always a
b430: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
b440: 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72  ed on the NT ker
b450: 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  nel..  */.  retu
b460: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
b470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
b480: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
b490: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
b4a0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
b4b0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
b4c0: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
b4d0: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
b4e0: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
b4f0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
b500: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
b510: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
b520: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
b530: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
b540: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
b550: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
b560: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
b570: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
b580: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b590: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
b5a0: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
b5b0: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
b5c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b5d0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
b5e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
b5f0: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
b600: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
b610: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
b620: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b630: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
b640: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
b650: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b660: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b670: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
b680: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  oc %u bytes (%lu
b690: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
b6b0: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
b6c0: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
b6d0: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
b6e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
b6f0: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
b700: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
b710: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
b720: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
b730: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
b740: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
b750: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
b760: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
b770: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
b780: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b790: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b7a0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b7b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b7c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b7d0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b7e0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b7f0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b800: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b810: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b820: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
b830: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
b840: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
b850: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
b860: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
b870: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
b880: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
b890: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b8a0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
b8b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b8c0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b8d0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
b8e0: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ree block %p (%l
b8f0: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
b910: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
b920: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
b930: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
b940: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
b950: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
b960: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
b970: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
b980: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
b990: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
b9a0: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
b9b0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
b9c0: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
b9d0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
b9e0: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
b9f0: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
ba00: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
ba10: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
ba20: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
ba30: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
ba40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
ba50: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
ba60: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
ba70: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
ba80: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
ba90: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
baa0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
bab0: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
bac0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
bad0: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
bae0: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
baf0: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
bb00: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
bb10: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
bb20: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
bb30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
bb40: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
bb50: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
bb60: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
bb70: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
bb80: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
bb90: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
bba0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bbb0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
bbc0: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
bbd0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bbf0: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
bc00: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
bc10: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
bc20: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
bc40: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
bc50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
bc60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
bc70: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
bc80: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
bc90: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
bca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
bcb0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
bcc0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
bcd0: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
bce0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
bcf0: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
bd00: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
bd10: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bd20: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bd30: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
bd40: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
bd50: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
bd60: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
bd70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
bd80: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
bd90: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
bda0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
bdb0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
bdc0: 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e  FLAGS, p) );.#en
bdd0: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
bde0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
bdf0: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
be00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
be10: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
be20: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
be30: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
be40: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
be50: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
be60: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
be70: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
be80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be90: 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72   p, osGetLastErr
bea0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
beb0: 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ap);.    return 
bec0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
bed0: 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (int)n;.}../*.**
bee0: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
bef0: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
bf00: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
bf10: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ation size..*/.s
bf20: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
bf30: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
bf40: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
bf50: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
bf60: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
bf70: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
bf80: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
bf90: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
bfa0: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
bfb0: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
bfc0: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
bfd0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
bfe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
bff0: 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20  RROR;.  assert( 
c000: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
c010: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
c020: 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  C1 );.  assert( 
c030: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
c040: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic2==WINMEM_MAGI
c050: 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  C2 );..#if !SQLI
c060: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
c070: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c080: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
c090: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c0a0: 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64  p ){.    DWORD d
c0b0: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53  wInitialSize = S
c0c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c0d0: 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20  _INIT_SIZE;.    
c0e0: 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53  DWORD dwMaximumS
c0f0: 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c  ize = (DWORD)sql
c100: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
c110: 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20  .nHeap;.    if( 
c120: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30  dwMaximumSize==0
c130: 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69   ){.      dwMaxi
c140: 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  mumSize = SQLITE
c150: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
c160: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  SIZE;.    }else 
c170: 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  if( dwInitialSiz
c180: 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20  e>dwMaximumSize 
c190: 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69  ){.      dwIniti
c1a0: 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d  alSize = dwMaxim
c1b0: 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  umSize;.    }.  
c1c0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c1d0: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
c1e0: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
c1f0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
c230: 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29  , dwMaximumSize)
c240: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
c250: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
c260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
c270: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c280: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
c290: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
c2a0: 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75   (%lu), flags=%u
c2b0: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20  , initSize=%lu, 
c2c0: 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20  maxSize=%lu",.  
c2d0: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
c2e0: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
c2f0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c300: 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  S, dwInitialSize
c310: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77 4d 61  ,.          dwMa
c320: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
c330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c340: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
c350: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
c360: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
c370: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
c380: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
c390: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
c3a0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
c3b0: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
c3c0: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
c3d0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
c3e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c3f0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
c400: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
c410: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
c420: 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c  p (%lu)", osGetL
c430: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
c440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c450: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
c460: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c470: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
c480: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
c490: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
c4a0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
c4b0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c4c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c4d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c4e0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
c4f0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
c500: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c510: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c520: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
c530: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c540: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c550: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
c560: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c570: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
c580: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
c590: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c5a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
c5b0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
c5c0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
c5d0: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
c5e0: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
c5f0: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c600: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c610: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c620: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c630: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c640: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
c650: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c660: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
c670: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
c680: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c690: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
c6a0: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
c6b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c6c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c6d0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c6e0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
c6f0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
c700: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
c710: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
c720: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
c730: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
c740: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c750: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
c760: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
c770: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c780: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
c790: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
c7a0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
c7b0: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
c7c0: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
c7d0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
c7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c7f0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
c800: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
c810: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
c820: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
c840: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c850: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
c860: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
c870: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
c880: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
c890: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
c8a0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c8b0: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
c8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
c8d0: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
c8e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c8f0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
c900: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
c910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
c920: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
c930: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
c940: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
c950: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
c960: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
c970: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
c980: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
c990: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
c9a0: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
c9b0: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
c9c0: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
c9d0: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
c9e0: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
c9f0: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
ca00: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
ca10: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
ca20: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
ca30: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
ca40: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
ca50: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
ca60: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
ca70: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
ca80: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
ca90: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
caa0: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
cab0: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
cac0: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
cad0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
cae0: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
caf0: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
cb00: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
cb10: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
cb20: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
cb30: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
cb40: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
cb50: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
cb60: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
cb70: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
cb80: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
cb90: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
cba0: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
cbb0: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
cbc0: 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46  oft Unicode (UTF
cbd0: 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  -16?)..**.** Spa
cbe0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
cbf0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
cc00: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
cc10: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
cc20: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
cc30: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
cc40: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
cc50: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
cc60: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
cc70: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
cc80: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
cc90: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
cca0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
ccb0: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
ccc0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
ccd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cce0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
ccf0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
cd00: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
cd10: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
cd20: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
cd30: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
cd40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cd50: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
cd60: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
cd70: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
cd80: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
cd90: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
cdc0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
cdd0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
cde0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
cdf0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
ce00: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
ce10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
ce20: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
ce30: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
ce40: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
ce50: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
ce60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
ce70: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
ce80: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
ce90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
ceb0: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
cec0: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
ced0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
cee0: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
cef0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42  zFilename;..  nB
cf00: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
cf10: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
cf20: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
cf30: 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c  ename, -1, 0, 0,
cf40: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
cf50: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
cf60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cf70: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
cf80: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
cf90: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
cfa0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
cfb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cfc0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
cfd0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
cfe0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
cff0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
d000: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
d010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d040: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d050: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
d060: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
d070: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
d080: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
d090: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
d0a0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
d0b0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
d0c0: 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   Unicode, based 
d0d0: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
d0e0: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
d0f0: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
d100: 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
d110: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
d120: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
d130: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
d140: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a  qlite3_malloc..*
d150: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
d160: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
d170: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
d180: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
d190: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
d1a0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  MbcsFilename;.  
d1b0: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
d1c0: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
d1d0: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
d1e0: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
d1f0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
d200: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
d210: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
d220: 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20   -1, NULL,.     
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69             0)*si
d250: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69  zeof(WCHAR);.  i
d260: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
d270: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d280: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
d290: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
d2a0: 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
d2b0: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
d2c0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
d2d0: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
d2e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d2f0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d300: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
d310: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
d320: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
d330: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20  zMbcsFilename,. 
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d360: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
d370: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  te==0 ){.    sql
d380: 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46  ite3_free(zMbcsF
d390: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
d3a0: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
d3b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
d3c0: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
d3d0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
d3e0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
d3f0: 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68  to multi-byte ch
d400: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20  aracter string, 
d410: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d420: 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65  user's ANSI code
d430: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
d440: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d450: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d460: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
d470: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
d480: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
d490: 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f  ar *winUnicodeTo
d4a0: 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69  Mbcs(LPCWSTR zWi
d4b0: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
d4c0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
d4d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
d4e0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
d4f0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
d500: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
d510: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
d520: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d530: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
d540: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
d550: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
d560: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
d570: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
d580: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
d590: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
d5a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
d5b0: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
d5c0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
d5d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d5e0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
d5f0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
d600: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
d610: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
d620: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
d650: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
d660: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
d670: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
d680: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
d690: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
d6a0: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
d6b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d6c0: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
d6d0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
d6e0: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
d6f0: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
d700: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d710: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d720: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d730: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
d740: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
d750: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
d760: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
d770: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74  har *zFilenameUt
d780: 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  f8;.  LPWSTR zTm
d790: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
d7a0: 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e  de = winMbcsToUn
d7b0: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
d7c0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
d7d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d7e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
d7f0: 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  nameUtf8 = winUn
d800: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
d810: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
d820: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
d830: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d840: 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameUtf8;.}../*.*
d850: 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20  * Convert UTF-8 
d860: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
d870: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20  racter string.  
d880: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d890: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
d8a0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d8b0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d8c0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
d8d0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
d8e0: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73  tf8_to_mbcs(cons
d8f0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
d900: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
d910: 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57  enameMbcs;.  LPW
d920: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
d930: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55   zTmpWide = winU
d940: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
d950: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
d960: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
d970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d980: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
d990: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62  = winUnicodeToMb
d9a0: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
d9b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
d9c0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
d9d0: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
d9e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d9f0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
da00: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
da10: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
da20: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
da30: 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64  on.** the provid
da40: 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  ed arguments.  T
da50: 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74  he type argument
da60: 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72   must be 1 in or
da70: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a  der to set the.*
da80: 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  * data directory
da90: 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74   or 2 in order t
daa0: 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72  o set the tempor
dab0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
dac0: 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72  The zValue.** ar
dad0: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
dae0: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
daf0: 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65  ory to use.  The
db00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69   return value wi
db10: 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  ll be.** SQLITE_
db20: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
db30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
db40: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
db50: 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c  tory(DWORD type,
db60: 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29   LPCWSTR zValue)
db70: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72  {.  char **ppDir
db80: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e  ectory = 0;.#ifn
db90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dba0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72  AUTOINIT.  int r
dbb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
dbc0: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
dbd0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
dbe0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70  #endif.  if( typ
dbf0: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
dc00: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
dc10: 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72  YPE ){.    ppDir
dc20: 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65  ectory = &sqlite
dc30: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
dc40: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79  ;.  }else if( ty
dc50: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
dc60: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
dc70: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
dc80: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
dc90: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
dca0: 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
dcb0: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
dcc0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
dcd0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
dce0: 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20  RY_TYPE.        
dcf0: 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54    || type==SQLIT
dd00: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
dd10: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b  ECTORY_TYPE.  );
dd20: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
dd30: 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74  rectory || sqlit
dd40: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
dd50: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20  e(*ppDirectory, 
dd60: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
dd70: 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74 6f  .  if( ppDirecto
dd80: 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ry ){.    char *
dd90: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a  zValueUtf8 = 0;.
dda0: 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26      if( zValue &
ddb0: 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20  & zValue[0] ){. 
ddc0: 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20       zValueUtf8 
ddd0: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
dde0: 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  f8(zValue);.    
ddf0: 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66    if ( zValueUtf
de00: 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  8==0 ){.        
de10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
de20: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
de30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
de40: 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ree(*ppDirectory
de50: 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74  );.    *ppDirect
de60: 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38  ory = zValueUtf8
de70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
de80: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
de90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dea0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  R;.}../*.** The 
deb0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
dec0: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
ded0: 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  sg.** is zero if
dee0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
def0: 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
df00: 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
df10: 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
df20: 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
df30: 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  was truncated)..
df40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
df50: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
df60: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
df70: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
df80: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
df90: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
dfa0: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
dfb0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
dfc0: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
dfd0: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
dfe0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
dff0: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
e000: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
e010: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
e020: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
e030: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
e040: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
e050: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e   0;..  if( osIsN
e060: 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
e070: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57  E_OS_WINRT.    W
e080: 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53  CHAR zTempWide[S
e090: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
e0a0: 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b  ERRMSG_CHARS+1];
e0b0: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
e0c0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
e0d0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
e0e0: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
e110: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
e120: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
e170: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e190: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
e1b0: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
e1e0: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
e1f0: 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20  HARS,.          
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20     0);.#else.   
e220: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
e230: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
e240: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
e250: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
e260: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
e270: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
e2a0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
e2b0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
e2d0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
e2e0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
e310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
e330: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
e380: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64          0);.#end
e3d0: 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  if.    if( dwLen
e3e0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
e3f0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
e400: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
e410: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
e420: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
e430: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e440: 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63    zOut = winUnic
e450: 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57  odeToUtf8(zTempW
e460: 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ide);.      sqli
e470: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
e480: 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  oc();.#if !SQLIT
e490: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
e4a0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e4b0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e4c0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e4d0: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e4e0: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e4f0: 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Wide);.#endif.  
e500: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
e510: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
e520: 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
e530: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
e540: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
e550: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
e560: 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  A(FORMAT_MESSAGE
e570: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
e580: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
e5b0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
e5e0: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
e5f0: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
e640: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c   (LPSTR) &zTemp,
e690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
e6d0: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
e6e0: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
e6f0: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
e700: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
e710: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
e720: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
e730: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e740: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
e750: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
e760: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  f8(zTemp);.     
e770: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
e780: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e790: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e7a0: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e7b0: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e7c0: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e7d0: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e7e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
e7f0: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
e800: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
e810: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e820: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
e830: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
e840: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
e850: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
e860: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
e870: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
e880: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
e890: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
e8a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e8b0: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
e8c0: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
e8d0: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
e8e0: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
e8f0: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
e900: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e910: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
e920: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
e930: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
e940: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
e950: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
e960: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
e970: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
e980: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
e990: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
e9a0: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
e9b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
e9c0: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
e9d0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
e9e0: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
e9f0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
ea00: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
ea10: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
ea20: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
ea30: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
ea40: 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d   from.** FormatM
ea50: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
ea60: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
ea70: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
ea80: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
ea90: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
eaa0: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
eab0: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
eac0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
ead0: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
eae0: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a  TE_CANTOPEN)..**
eaf0: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
eb00: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
eb10: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
eb20: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
eb30: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
eb40: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
eb50: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
eb60: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
eb70: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
eb80: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
eb90: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
eba0: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
ebb0: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
ebc0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
ebd0: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
ebe0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
ebf0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
ec00: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
ec10: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
ec40: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
ec50: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
ec60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
ec70: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
ec80: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
ec90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
eca0: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
ecb0: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
ecc0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
ecd0: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
ece0: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
ecf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
ed00: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
ed10: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
ed20: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
ed30: 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ed50: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
ed60: 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
ed70: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed90: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
eda0: 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
edb0: 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
edc0: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
edd0: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
ede0: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
edf0: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
ee00: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
ee10: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
ee20: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
ee30: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
ee40: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
ee50: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
ee60: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
ee70: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
ee80: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
ee90: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
eea0: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
eeb0: 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
eec0: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
eed0: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
eee0: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
eef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
ef00: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
ef10: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
ef20: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
ef30: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
ef40: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
ef50: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
ef60: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
ef70: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
ef80: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
ef90: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
efa0: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
efb0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
efc0: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
efd0: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
efe0: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
eff0: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
f000: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
f010: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
f020: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
f030: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
f040: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
f050: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
f060: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
f070: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
f080: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
f090: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
f0a0: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
f0b0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
f0c0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
f0d0: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
f0e0: 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
f0f0: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
f100: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
f110: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  DELAY;../*.** Th
f120: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
f130: 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75  try1" macro is u
f140: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
f150: 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
f160: 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   I/O.** error co
f170: 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  de obtained via 
f180: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69  GetLastError() i
f190: 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  s eligible to be
f1a0: 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a   retried.  It.**
f1b0: 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65   must accept the
f1c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52   error code DWOR
f1d0: 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72  D as its only ar
f1e0: 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c  gument and shoul
f1f0: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
f200: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
f210: 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69  r code is transi
f220: 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e  ent in nature an
f230: 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  d the operation.
f240: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
f250: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
f260: 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72  e original error
f270: 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75   might succeed u
f280: 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74  pon being.** ret
f290: 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d  ried.  The argum
f2a0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
f2b0: 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61  o should be a va
f2c0: 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64  riable..**.** Ad
f2d0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61  ditionally, a ma
f2e0: 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f  cro named "winIo
f2f0: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
f300: 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49  y be defined.  I
f310: 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  f it.** is defin
f320: 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ed, it will be c
f330: 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68  onsulted only wh
f340: 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69  en the macro "wi
f350: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
f360: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  .** returns zero
f370: 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  .  The "winIoerr
f380: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
f390: 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f   is completely o
f3a0: 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d  ptional and.** m
f3b0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e  ay be used to in
f3c0: 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c  clude additional
f3d0: 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20   error codes in 
f3e0: 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f  the set that sho
f3f0: 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  uld.** result in
f400: 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f   the failing I/O
f410: 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67   operation being
f420: 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20   retried by the 
f430: 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64  caller.  If.** d
f440: 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e  efined, the "win
f450: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
f460: 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62  macro must exhib
f470: 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
f480: 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63  ntics.** identic
f490: 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74  al to those of t
f4a0: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
f4b0: 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f  etry1" macro..*/
f4c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69  .#if !defined(wi
f4d0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29  nIoerrCanRetry1)
f4e0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72  .#define winIoer
f4f0: 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28  rCanRetry1(a) ((
f500: 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53  (a)==ERROR_ACCES
f510: 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20  S_DENIED)       
f520: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f550: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
f560: 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20  N)    || \.     
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f590: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
f5a0: 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ION)       || \.
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f5d0: 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f  a)==ERROR_DEV_NO
f5e0: 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20  T_EXIST)        
f5f0: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
f620: 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20  ETNAME_DELETED) 
f630: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
f660: 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
f670: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
f6a0: 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b  )==ERROR_NETWORK
f6b0: 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23  _UNREACHABLE)).#
f6c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
f6d0: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
f6e0: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
f6f0: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
f700: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
f710: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
f720: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
f730: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
f740: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
f750: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
f760: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
f770: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f780: 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
f790: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
f7a0: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
f7b0: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
f7c0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
f7d0: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
f7e0: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
f7f0: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
f800: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
f810: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f820: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
f830: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f840: 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
f850: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
f860: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
f870: 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
f880: 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
f890: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f8a0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77   }.#if defined(w
f8b0: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
f8c0: 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e  ).  else if( win
f8d0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65  IoerrCanRetry2(e
f8e0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f8f0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f900: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f910: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f920: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f930: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f940: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
f950: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
f960: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
f970: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f980: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
f990: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
f9a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f9b0: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
f9c0: 6e 52 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65  nRetry, int line
f9d0: 6e 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  no){.  if( nRetr
f9e0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
f9f0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
fa00: 43 45 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79  CE,.      "delay
fa10: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
fa20: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
fa30: 74 20 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20  t at line %d",. 
fa40: 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
fa50: 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28  ryDelay*nRetry*(
fa60: 6e 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e  nRetry+1)/2, lin
fa70: 65 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  eno.    );.  }.}
fa80: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
fa90: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
faa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fae0: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
faf0: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
fb00: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
fb10: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
fb20: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
fb30: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
fb40: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
fb50: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
fb60: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
fb70: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
fb80: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
fb90: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
fba0: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
fbb0: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
fbc0: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
fbd0: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
fbe0: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
fbf0: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
fc00: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
fc10: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
fc20: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
fc30: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
fc40: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
fc50: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
fc60: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
fc70: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
fc80: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
fc90: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
fca0: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
fcb0: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
fcc0: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
fcd0: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
fce0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
fcf0: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
fd00: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
fd10: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
fd20: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
fd30: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
fd40: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
fd50: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
fd60: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
fd70: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
fd80: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
fd90: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
fda0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
fdb0: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
fdc0: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
fdd0: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
fde0: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
fdf0: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
fe00: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
fe10: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
fe20: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
fe30: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
fe40: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
fe50: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
fe60: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
fe70: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
fe80: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
fe90: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
fea0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
feb0: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
fec0: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
fed0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
fee0: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
fef0: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
ff00: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
ff10: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
ff20: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
ff30: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
ff40: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
ff50: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
ff60: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
ff70: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
ff80: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
ff90: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
ffa0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
ffb0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
ffc0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
ffd0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
ffe0: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
fff0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
10000 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
10010 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
10020 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
10030 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
10040 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
10050 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
10060 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
10070 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
10080 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
10090 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
100a0 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
100b0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
100c0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
100d0 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
100e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
100f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
10100 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
10110 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
10120 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
10130 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
10140 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
10150 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
10160 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
10170 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
10180 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
10190 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
101a0 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
101b0 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
101c0 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
101d0 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
101e0 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
101f0 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
10200 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
10210 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
10220 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
10230 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
10240 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
10250 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
10260 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
10270 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
10280 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
10290 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
102a0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
102b0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
102c0 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
102d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
102e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
102f0 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
10300 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
10330 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
10340 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
10350 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
10360 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
10370 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
10380 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
10390 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
103a0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
103b0 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
103c0 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
103d0 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
103e0 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
103f0 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
10400 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
10410 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
10420 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
10430 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
10440 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
10450 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
10460 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
10470 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
10480 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
10490 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
104a0 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
104b0 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
104f0 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
10500 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
10540 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
10550 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
10560 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
10570 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
10580 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
10590 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
105a0 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
105b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
105c0 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
105d0 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
105e0 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
105f0 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
10600 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
10610 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
10620 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
10630 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
10640 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10650 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
10660 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
10670 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
10680 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
10690 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
106a0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
106b0 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
106c0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
106d0 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
106e0 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
106f0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
10700 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
10710 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
10720 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
10730 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
10740 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
10750 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
10760 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
10770 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
10780 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
10790 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
107a0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
107b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
107c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
107d0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
107e0 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
107f0 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
10800 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10810 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
10820 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
10830 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
10840 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
10850 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
10860 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
10870 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
10880 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
10890 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
108a0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
108b0 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
108c0 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
108d0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
108e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
108f0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
10900 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10910 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
10920 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10940 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
10950 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
10960 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
10970 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
10980 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
10990 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
109a0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
109b0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
109c0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
109d0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
109e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
109f0 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
10a00 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
10a10 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
10a20 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
10a30 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
10a40 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
10a50 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
10a60 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
10a70 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
10a80 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
10a90 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
10aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
10ac0 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
10ad0 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
10ae0 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
10af0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
10b00 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
10b10 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
10b20 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
10b30 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
10b40 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
10b50 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
10b60 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
10b70 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
10b80 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
10b90 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
10ba0 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
10bb0 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
10bc0 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
10bd0 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
10be0 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
10bf0 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
10c00 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10c10 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
10c20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10c30 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
10c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10c50 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
10c60 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
10c70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
10c80 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
10c90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
10ca0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
10cb0 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
10cc0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
10cd0 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
10ce0 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
10cf0 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
10d00 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
10d10 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10d20 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
10d30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
10d40 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
10d50 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
10d60 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
10d70 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
10d80 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
10d90 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
10da0 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
10db0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
10dc0 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
10dd0 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
10de0 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
10df0 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
10e00 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
10e10 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10e20 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
10e30 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
10e40 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
10e50 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
10e60 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
10e70 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
10e80 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
10e90 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
10ea0 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
10eb0 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
10ec0 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
10ed0 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
10ee0 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
10ef0 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
10f00 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
10f10 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
10f20 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
10f30 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
10f40 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
10f50 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
10f60 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
10f70 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
10f80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10f90 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
10fa0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10fb0 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
10fc0 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
10fd0 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
10fe0 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
10ff0 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
11000 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
11010 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
11020 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
11030 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
11040 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
11050 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
11060 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
11070 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
11080 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
11090 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
110a0 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
110b0 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
110c0 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
110d0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
110e0 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
110f0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
11100 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
11110 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
11120 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
11130 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
11140 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11150 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11160 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
11170 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
11180 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
11190 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
111a0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
111b0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
111c0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
111d0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
111e0 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
111f0 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
11200 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
11210 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
11220 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
11230 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
11240 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
11250 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11260 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
11270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11280 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11290 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
112a0 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
112b0 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
112c0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
112d0 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
112e0 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
112f0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
11300 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
11310 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
11320 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
11330 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
11340 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
11350 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
11360 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
11370 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
11380 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
11390 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
113a0 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
113b0 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
113c0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
113d0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
113e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
113f0 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
11400 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
11410 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
11420 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
11430 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
11440 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
11450 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
11460 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
11470 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
11480 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
11490 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
114a0 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
114b0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
114c0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
114d0 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
114e0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
114f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
11500 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11510 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11520 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
11530 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
11540 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
11550 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
11560 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
11570 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
11580 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
11590 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
115a0 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
115b0 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
115c0 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
115d0 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
115e0 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
115f0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
11600 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
11610 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
11620 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
11630 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
11640 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
11650 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
11660 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
11670 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
11680 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
11690 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
116a0 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
116b0 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
116c0 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
116d0 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
116e0 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
116f0 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
11700 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
11710 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
11720 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
11730 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
11740 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
11750 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11760 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
11770 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
11780 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
11790 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
117a0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
117b0 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
117c0 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
117d0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
117e0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
117f0 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
11800 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
11810 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
11820 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11830 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11840 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
11850 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11860 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
11870 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
11880 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
11890 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
118a0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
118b0 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
118c0 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
118d0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
118e0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
118f0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
11900 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
11910 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
11920 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11930 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
11940 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
11950 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11960 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
11970 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11980 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
11990 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
119a0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
119b0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
119c0 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
119d0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
119e0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
119f0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11a00 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
11a10 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11a20 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11a30 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11a40 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11a50 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
11a60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11a70 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
11a80 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
11a90 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
11aa0 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
11ab0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
11ad0 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
11ae0 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
11af0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
11b00 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
11b10 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
11b20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11b30 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11b40 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11b50 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11b60 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
11b70 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11b80 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
11b90 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
11ba0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
11bb0 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
11bc0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
11bd0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
11be0 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
11bf0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11c00 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
11c10 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
11c20 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
11c30 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
11c40 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
11c90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11ca0 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
11cb0 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
11cc0 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
11cd0 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
11ce0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11cf0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
11d00 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
11d10 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
11d20 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
11d30 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
11d40 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11d50 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
11d60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11d70 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
11d80 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
11d90 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
11da0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
11db0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
11dc0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
11dd0 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
11de0 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
11df0 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
11e00 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
11e10 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
11e20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11e30 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
11e40 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
11e50 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
11e60 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
11e70 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
11e80 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
11e90 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
11ea0 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
11eb0 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
11ec0 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
11ed0 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
11ee0 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
11ef0 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
11f00 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
11f10 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11f20 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11f30 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11f40 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
11f50 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
11f60 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
11f70 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
11f80 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
11f90 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
11fa0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
11fb0 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
11fc0 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
11fd0 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
11fe0 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11ff0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
12000 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
12010 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
12020 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
12030 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
12040 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
12050 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
12060 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
12070 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
12080 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
12090 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
120a0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
120b0 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
120c0 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
120d0 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
120e0 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
120f0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
12100 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
12130 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
12140 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
12150 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
12160 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
12170 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
12180 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
12190 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
121a0 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
121b0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
121c0 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
121d0 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
121e0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
121f0 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
12200 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
12210 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
12220 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
12230 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
12240 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
12250 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
12260 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
12290 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
122a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
122f0 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
12300 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
12310 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
12320 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
12330 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
12340 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
12350 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
123b0 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
123c0 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
123d0 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
123e0 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
123f0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
12400 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
12410 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
12420 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
12430 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
12440 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
12450 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
12460 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
12470 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
12480 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
12490 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
124a0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
124b0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
124c0 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
124d0 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
124e0 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
124f0 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
12500 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
12510 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
12520 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
12530 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
12540 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12550 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
12560 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
12570 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
12580 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
12590 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
125a0 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125c0 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
125d0 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
125e0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
125f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12600 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
12610 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
12620 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
12630 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12650 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
12660 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
12670 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
12680 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12690 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
126a0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
126b0 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
126c0 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
126d0 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
126e0 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
126f0 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
12700 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
12710 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
12720 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
12730 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
12740 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
12750 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
12760 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
12770 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
12780 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
12790 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
127a0 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
127b0 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
127c0 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
127d0 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
127e0 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
127f0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
12800 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
12810 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
12820 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
12830 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
12840 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
12850 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
12860 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
12870 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
12880 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
12890 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
128a0 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
128b0 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
128c0 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
128d0 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
128e0 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
128f0 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
12900 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
12910 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
12920 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12930 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
12940 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12950 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
12960 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
12970 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12980 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
12990 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
129a0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
129b0 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
129c0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
129d0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
129e0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
129f0 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
12a00 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
12a10 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
12a20 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12a30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12a40 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12a50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
12a60 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
12a70 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
12a80 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
12a90 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
12aa0 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
12ab0 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
12ac0 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
12ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
12ae0 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
12af0 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b10 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
12b20 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
12b30 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
12b40 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
12b50 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
12b60 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
12b70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
12b80 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
12b90 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
12ba0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12bb0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12bc0 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
12bd0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12be0 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
12bf0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12c00 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
12c10 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
12c20 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
12c30 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12c40 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
12c50 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
12c60 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
12c70 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
12c80 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
12c90 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
12ca0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12cb0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
12cc0 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
12cd0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12ce0 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
12cf0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
12d00 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
12d10 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
12d20 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
12d30 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
12d40 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
12d50 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
12d60 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
12d70 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
12d80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12d90 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
12da0 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
12db0 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
12dc0 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
12dd0 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
12de0 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
12df0 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
12e00 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
12e10 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
12e20 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
12e30 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
12e40 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
12e50 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
12e60 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
12e70 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
12e80 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
12e90 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
12ea0 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
12eb0 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
12ec0 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
12ed0 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
12ee0 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
12ef0 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
12f00 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
12f10 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
12f20 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
12f30 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12f40 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
12f50 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
12f60 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
12f70 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
12f80 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12f90 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
12fa0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12fc0 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
12fd0 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
12fe0 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
12ff0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
13000 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
13010 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
13020 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
13030 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
13040 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
13050 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ile=%p\n",.     
13060 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
13070 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
13080 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
13090 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
130a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
130b0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
130c0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
130d0 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
130e0 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
130f0 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
13100 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
13110 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
13120 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
13130 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
13140 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
13150 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
13160 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
13170 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
13180 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
13190 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
131a0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
131b0 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
131c0 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
131d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
131e0 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
131f0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
13200 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
13210 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69        osDeleteFi
13220 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
13230 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
13240 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69        && osGetFi
13250 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46  leAttributesW(pF
13260 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
13270 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66  ose)!=0xffffffff
13280 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
13290 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
132a0 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
132b0 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
132c0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
132d0 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
132e0 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
132f0 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
13300 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
13310 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
13320 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
13330 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
13340 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
13350 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
13360 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
13370 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
13380 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
13390 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
133a0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
133b0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
133c0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
133d0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f  , pFile->h, rc ?
133e0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
133f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  ));.  return rc 
13400 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ? SQLITE_OK.    
13410 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67          : winLog
13420 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
13430 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c  RR_CLOSE, osGetL
13440 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22        "winClose"
13470 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
13490 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
134a0 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
134b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
134c0 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
134d0 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
134e0 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
134f0 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
13500 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
13510 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13520 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c  t winRead(.  sql
13530 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
13540 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
13550 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
13560 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13580 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e  Write content in
13590 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
135a0 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
135c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
135d0 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73  s to read */.  s
135e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
135f0 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67  set       /* Beg
13600 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68  in reading at th
13610 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a  is offset */.){.
13620 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
13630 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
13640 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
13650 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 4f  _OVERLAPPED).  O
13660 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
13670 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  pped;          /
13680 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
13690 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65   ReadFile. */.#e
136a0 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
136b0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
136c0 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
136d0 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
136e0 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
136f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13700 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
13710 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
13720 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
13730 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
13740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13750 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
13760 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
13770 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13780 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
13790 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
137a0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
137b0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
137c0 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f  IOERR_READ);.  O
137d0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
137e0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
137f0 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72   file=%p, buffer
13800 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  =%p, amount=%d, 
13810 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f 66  ".           "of
13820 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
13830 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  %d\n", osGetCurr
13840 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13850 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
13860 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
13870 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
13880 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
13890 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
138a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
138b0 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
138c0 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
138d0 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
138e0 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
138f0 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
13900 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
13910 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
13920 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
13930 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
13940 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
13950 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
13960 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
13970 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
13980 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
13990 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
139a0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
139b0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
139c0 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 70 69 64  (("READ-MMAP pid
139d0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
139e0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
139f0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
13a00 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
13a10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
13a20 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
13a30 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
13a40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
13a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
13a60 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
13a70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
13a80 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
13a90 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
13aa0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
13ab0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
13ac0 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
13ad0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
13ae0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
13af0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
13b00 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
13b10 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
13b20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
13b30 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
13b40 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13b50 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
13b60 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 69 6e  APPED).  if( win
13b70 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
13b80 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f  offset) ){.    O
13b90 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
13ba0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
13bb0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13bc0 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ITE_FULL\n",.   
13bd0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13be0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
13bf0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
13c00 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13c10 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
13c20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
13c30 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
13c40 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
13c50 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
13c60 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
13c70 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
13c80 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
13c90 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
13ca0 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
13cb0 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
13cc0 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
13cd0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
13ce0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
13cf0 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
13d00 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
13d10 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
13d20 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
13d30 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
13d40 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
13d50 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
13d60 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
13d70 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
13d80 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
13d90 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13da0 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
13db0 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
13dc0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
13dd0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
13de0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
13df0 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20  ("READ pid=%lu, 
13e00 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
13e10 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
13e20 52 52 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20  RR_READ\n",.    
13e30 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
13e40 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
13e50 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
13e60 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13e70 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13e80 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
13e90 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
13ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13eb0 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64          "winRead
13ec0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13ed0 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f  ;.  }.  winLogIo
13ee0 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49  err(nRetry, __LI
13ef0 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 6e 52 65  NE__);.  if( nRe
13f00 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
13f10 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
13f20 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
13f30 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
13f40 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
13f50 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
13f60 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
13f70 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f  mt-nRead);.    O
13f80 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
13f90 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
13fa0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13fb0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
13fc0 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20  READ\n",.       
13fd0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
13fe0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
13ff0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
14000 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14010 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
14020 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  READ;.  }..  OST
14030 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d  RACE(("READ pid=
14040 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
14050 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
14060 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
14070 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14080 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14090 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
140a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
140b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  OK;.}../*.** Wri
140c0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
140d0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
140e0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
140f0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
14100 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
14110 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
14120 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
14130 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a  c int winWrite(.
14140 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
14150 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
14160 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69    /* File to wri
14170 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e  te into */.  con
14180 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  st void *pBuf,  
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141a0 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20  The bytes to be 
141b0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
141c0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
141f0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71  to write */.  sq
14200 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
14210 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et            /*
14220 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   Offset into the
14230 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77   file to begin w
14240 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a  riting at */.){.
14250 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72    /* True if err
14280 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
14290 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20   else false */. 
142a0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
142b0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
142c0 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
142d0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
142e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
142f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14300 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20  f retries */..  
14310 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
14320 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14330 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
14340 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
14350 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29  ITE_IOERR_WRITE)
14360 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
14370 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e  fullError(return
14380 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a   SQLITE_FULL);..
14390 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
143a0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
143b0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75  =%p, file=%p, bu
143c0 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
143d0 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
143e0 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c   "offset=%lld, l
143f0 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74  ock=%d\n", osGet
14400 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14410 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
14420 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
14430 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
14440 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
14450 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
14460 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14470 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
14480 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
14490 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
144a0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
144b0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
144c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
144d0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
144e0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
144f0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
14500 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
14510 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
14520 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
14530 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
14540 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
14550 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
14560 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
14570 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
14580 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d  TRACE(("WRITE-MM
14590 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AP pid=%lu, pFil
145a0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
145b0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
145d0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
145e0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
145f0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
14600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14610 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
14620 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
14630 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
14640 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
14650 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
14660 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
14670 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
14680 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
14690 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
146a0 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
146b0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
146c0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
146d0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
146e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
146f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
14700 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64  WINCE || defined
14710 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
14720 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 72  _OVERLAPPED).  r
14730 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  c = winSeekFile(
14740 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a  pFile, offset);.
14750 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23    if( rc==0 ){.#
14760 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a  else.  {.#endif.
14770 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
14780 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
14790 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
147a0 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20  _OVERLAPPED).   
147b0 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
147c0 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f  lapped;        /
147d0 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
147e0 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23   WriteFile. */.#
147f0 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52  endif.    u8 *aR
14800 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b  em = (u8 *)pBuf;
14810 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
14820 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
14830 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  n */.    int nRe
14840 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20  m = amt;        
14850 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14860 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f   of bytes yet to
14870 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
14880 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b     DWORD nWrite;
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65   /* Bytes writte
148b0 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46  n by each WriteF
148c0 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  ile() call */.  
148d0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
148e0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20  o = NO_ERROR;   
148f0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
14900 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
14910 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  r() */..#if !SQL
14920 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
14930 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14940 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
14950 50 45 44 29 0a 20 20 20 20 6d 65 6d 73 65 74 28  PED).    memset(
14960 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
14970 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
14980 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70  D));.    overlap
14990 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
149a0 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
149b0 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76  fffffff);.    ov
149c0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
149d0 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
149e0 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
149f0 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a  ffffff);.#endif.
14a00 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  .    while( nRem
14a10 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  >0 ){.#if SQLITE
14a20 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66  _OS_WINCE || def
14a30 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
14a40 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
14a50 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
14a60 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
14a70 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
14a80 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c  Write, 0) ){.#el
14a90 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  se.      if( !os
14aa0 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
14ab0 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
14ac0 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61  &nWrite, &overla
14ad0 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a  pped) ){.#endif.
14ae0 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52          if( winR
14af0 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
14b00 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
14b10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14b20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14b30 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
14b40 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
14b50 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d  ite<=(DWORD)nRem
14b60 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57   );.      if( nW
14b70 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
14b80 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b  e>(DWORD)nRem ){
14b90 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
14ba0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
14bb0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
14bc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
14bd0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
14be0 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
14bf0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
14c00 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20  VERLAPPED).     
14c10 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74   offset += nWrit
14c20 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  e;.      overlap
14c30 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
14c40 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
14c50 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
14c60 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
14c70 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
14c80 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
14c90 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69  7fffffff);.#endi
14ca0 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20  f.      aRem += 
14cb0 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52  nWrite;.      nR
14cc0 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em -= nWrite;.  
14cd0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d    }.    if( nRem
14ce0 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  >0 ){.      pFil
14cf0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
14d00 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
14d10 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
14d20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  }..  if( rc ){. 
14d30 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65     if(   ( pFile
14d40 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
14d50 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46  OR_HANDLE_DISK_F
14d60 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20  ULL ).       || 
14d70 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
14d80 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46  no==ERROR_DISK_F
14d90 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53  ULL )){.      OS
14da0 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69  TRACE(("WRITE pi
14db0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
14dc0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14dd0 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ITE_FULL\n",.   
14de0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
14df0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14e00 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14e10 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
14e20 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
14e30 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46  (SQLITE_FULL, pF
14e40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e60 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69           "winWri
14e70 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te1", pFile->zPa
14e80 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f  th);.    }.    O
14e90 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70  STRACE(("WRITE p
14ea0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
14eb0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
14ec0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
14ed0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14ee0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
14ef0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
14f00 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
14f10 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
14f20 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
14f30 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e  R_WRITE, pFile->
14f40 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 22 77 69 6e 57 72 69 74 65 32 22 2c 20 70    "winWrite2", p
14f70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
14f80 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f  }else{.    winLo
14f90 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f  gIoerr(nRetry, _
14fa0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20  _LINE__);.  }.  
14fb0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
14fc0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14fd0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14fe0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
14ff0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15000 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15010 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15020 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
15030 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15040 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
15050 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
15060 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
15070 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e  atic int winTrun
15080 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
15090 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
150a0 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77  nt64 nByte){.  w
150b0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
150c0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
150d0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62  * File handle ob
150e0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
150f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
15100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
15110 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69  urn code for thi
15120 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
15130 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
15140 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15150 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
15160 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
15170 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
15180 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ATE);.  OSTRACE(
15190 28 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25  ("TRUNCATE pid=%
151a0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
151b0 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
151c0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
151d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
151e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
151f0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
15200 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d  h, nByte, pFile-
15210 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20  >locktype));..  
15220 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
15230 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
15240 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
15250 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
15260 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
15270 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
15280 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
15290 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
152a0 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
152b0 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
152c0 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
152d0 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
152e0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
152f0 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
15300 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
15310 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
15320 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
15330 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
15340 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
15350 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
15360 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
15370 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
15380 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
15390 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
153a0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
153b0 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
153c0 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65  . */.  if( winSe
153d0 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  ekFile(pFile, nB
153e0 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
153f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
15400 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
15410 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
15420 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15430 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
15440 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65  runcate1", pFile
15450 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
15460 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e  e if( 0==osSetEn
15470 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  dOfFile(pFile->h
15480 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
15490 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
154a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
154b0 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50  !=ERROR_USER_MAP
154c0 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20  PED_FILE) ){.   
154d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
154e0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
154f0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
15500 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
15510 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
15520 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22    "winTruncate2"
15550 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
15560 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
15570 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15580 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
15590 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  e was truncated 
155a0 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
155b0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
155c0 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64  ntly.  ** mapped
155d0 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20   region, reduce 
155e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61  the effective ma
155f0 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65  pping size as we
15600 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a  ll. SQLite will.
15610 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
15620 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
15630 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
15640 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
15650 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20  m now on..  */. 
15660 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70   if( pFile->pMap
15670 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c  Region && nByte<
15680 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15690 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  ){.    pFile->mm
156a0 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
156b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53    }.#endif..  OS
156c0 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
156d0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
156e0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
156f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
15700 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
15710 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15720 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
15730 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
15740 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15750 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15760 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
15770 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
15780 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
15790 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
157a0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
157b0 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
157c0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
157d0 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
157e0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
157f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
15800 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
15810 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
15820 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
15830 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
15840 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
15850 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
15860 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
15870 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
15880 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
15890 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
158a0 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
158b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
158c0 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
158d0 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
158e0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
158f0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
15900 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
15910 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
15920 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
15930 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
15940 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
15950 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15960 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20  HAVE_OS_TRACE). 
15970 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68   /*.  ** Used wh
15980 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  en SQLITE_NO_SYN
15990 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  C is not defined
159a0 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65   and by the asse
159b0 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a  rt() and/or.  **
159c0 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f   OSTRACE() macro
159d0 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69  s..   */.  winFi
159e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
159f0 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a  File*)id;.#else.
15a00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
15a10 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a  ER(id);.#endif..
15a20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15a30 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  );.  /* Check th
15a40 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
15a50 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
15a60 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
15a70 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
15a80 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
15a90 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
15aa0 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
15ab0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
15ac0 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
15ad0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
15ae0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
15af0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
15b00 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
15b10 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
15b20 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
15b30 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
15b40 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
15b50 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
15b60 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
15b70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
15b80 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52  _FULL );..  OSTR
15b90 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25  ACE(("SYNC pid=%
15ba0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15bb0 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
15bc0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
15bd0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15be0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15bf0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15c00 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  , flags,.       
15c10 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
15c20 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ype));..#ifndef 
15c30 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e  SQLITE_TEST.  UN
15c40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
15c50 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69  lags);.#else.  i
15c60 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  f( (flags&0x0F)=
15c70 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
15c80 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
15c90 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
15ca0 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
15cb0 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
15cc0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
15cd0 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
15ce0 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
15cf0 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
15d00 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
15d10 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
15d20 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
15d30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
15d40 43 2d 4e 4f 50 20 70 69 64 3d 25 6c 75 2c 20 70  C-NOP pid=%lu, p
15d50 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15d60 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
15d70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
15d80 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15d90 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15da0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
15db0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
15dc0 6c 73 65 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  lse.#if SQLITE_M
15dd0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
15de0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70   if( pFile->pMap
15df0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66  Region ){.    if
15e00 28 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66 46  ( osFlushViewOfF
15e10 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ile(pFile->pMapR
15e20 65 67 69 6f 6e 2c 20 30 29 20 29 7b 0a 20 20 20  egion, 0) ){.   
15e30 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
15e40 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  C-MMAP pid=%lu, 
15e50 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
15e60 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
15e70 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
15e80 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 6f 73 47 65  LITE_OK\n", osGe
15e90 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15ea0 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d(),.           
15eb0 20 20 20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65      pFile, pFile
15ec0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a  ->pMapRegion));.
15ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ee0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15ef0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
15f00 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
15f10 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20  ACE(("SYNC-MMAP 
15f20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
15f30 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
15f40 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
15f50 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f     "rc=SQLITE_IO
15f60 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47  ERR_MMAP\n", osG
15f70 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
15f80 49 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Id(),.          
15f90 20 20 20 20 20 70 46 69 6c 65 2c 20 70 46 69 6c       pFile, pFil
15fa0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b  e->pMapRegion));
15fb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
15fc0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15fd0 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
15fe0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
16010 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
16020 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
16030 64 69 66 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75  dif.  rc = osFlu
16040 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
16050 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c  ile->h);.  Simul
16060 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46  ateIOError( rc=F
16070 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63  ALSE );.  if( rc
16080 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
16090 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20  ("SYNC pid=%lu, 
160a0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
160b0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
160c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
160d0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
160e0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
160f0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16110 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
16120 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16130 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16140 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  r();.    OSTRACE
16150 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c  (("SYNC pid=%lu,
16160 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16170 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
16180 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 0a 20 20  ERR_FSYNC\n",.  
16190 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
161a0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
161b0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
161c0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
161d0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
161e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
161f0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
16200 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
16210 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
16220 79 6e 63 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ync2", pFile->zP
16230 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
16240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
16250 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
16260 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
16270 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
16280 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
16290 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
162a0 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
162b0 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
162c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
162d0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
162e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
162f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
16300 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16310 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
16320 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
16330 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16340 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
16350 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
16360 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
16370 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
16380 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
16390 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
163a0 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
163b0 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
163c0 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
163d0 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
163e0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
163f0 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
16430 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
16440 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
16450 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
16460 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16470 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
16480 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
16490 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
164a0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
164b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
164c0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
164d0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
164e0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
164f0 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
16500 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
16510 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
16520 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
16530 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
16540 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
16550 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
16560 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
16570 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
16580 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
16590 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
165a0 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
165b0 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
165c0 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
165d0 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
165e0 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
165f0 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
16600 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
16610 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16620 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
16630 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
16640 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
16650 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
16660 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
16670 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
16680 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
166a0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
166b0 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
166c0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
166d0 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
166e0 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
166f0 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
16700 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
16710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
16720 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
16730 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
16740 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
16750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16760 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
16770 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
16780 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
16790 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
167a0 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
167b0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
167c0 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
167d0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
167e0 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
167f0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
16800 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
16810 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
16820 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
16830 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
16840 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
16850 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
16860 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
16870 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
16880 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
16890 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
168a0 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
168b0 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
168c0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
168d0 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
168e0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
168f0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
16900 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
16910 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
16920 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
16930 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
16940 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
16950 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
16960 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
16970 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
16980 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
16990 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
169a0 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
169b0 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
169c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
169d0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
169e0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
169f0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
16a00 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
16a10 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
16a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a40 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
16a50 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
16a60 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
16a70 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
16a80 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
16a90 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
16aa0 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
16ab0 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
16ac0 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
16ad0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
16ae0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
16af0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16b00 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
16b10 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
16b20 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
16b30 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
16b40 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
16b50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
16b60 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
16b70 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
16b80 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
16b90 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
16ba0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
16bb0 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
16bc0 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
16bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16be0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
16bf0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
16c00 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
16c10 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
16c20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
16c30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16c40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
16c50 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
16c60 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
16c70 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
16c80 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
16c90 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
16ca0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
16cb0 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
16cc0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
16cd0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
16ce0 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
16cf0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
16d00 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16d10 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
16d20 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
16d30 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
16d40 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16d50 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16d60 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
16d70 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16da0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
16db0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
16dc0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
16dd0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
16de0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
16df0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
16e00 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
16e10 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
16e20 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
16e30 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
16e40 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
16e50 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
16e60 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16e70 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
16e80 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
16eb0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
16ec0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
16ed0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
16ee0 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
16ef0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16f00 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16f10 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
16f20 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
16f30 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
16f40 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
16f50 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
16f60 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
16f70 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
16f80 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
16f90 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
16fa0 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
16fb0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
16fc0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
16fd0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
16fe0 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
16ff0 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
17000 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
17010 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
17020 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
17030 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
17040 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
17050 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
17060 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
17070 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
17080 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
17090 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
170a0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
170b0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
170c0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
170d0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
170e0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
170f0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
17100 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
17110 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17120 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
17130 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17140 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
17150 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
17160 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
17170 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
17180 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
17190 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
171a0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
171b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
171d0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  nUnlockReadLock"
171e0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
171f0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
17200 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
17210 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c  e=%p, result=%d\
17220 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
17230 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  s));.  return re
17240 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
17250 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
17260 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
17270 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
17280 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
17290 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
172a0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
172b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
172c0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
172d0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
172e0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
172f0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
17300 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
17310 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
17320 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
17330 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
17340 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
17350 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
17360 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
17370 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
17380 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
17390 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
173a0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
173b0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
173c0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
173d0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
173e0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
173f0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
17400 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
17410 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
17420 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
17430 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
17440 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
17450 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
17460 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
17470 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
17480 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
17490 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
174a0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
174b0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
174c0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
174d0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
174e0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
174f0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
17500 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
17510 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
17520 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
17530 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
17540 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
17550 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
17560 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
17570 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
17580 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
17590 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
175a0 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
175b0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
175c0 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
175d0 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
175e0 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
175f0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
17600 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
17610 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17620 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
17630 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17640 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
17650 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
17660 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
17670 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
17680 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17690 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c  t of a Windows l
176a0 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
176b0 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
176c0 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
176d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
176e0 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
176f0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
17700 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
17710 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
17720 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
17730 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
17740 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
17750 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
17760 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
17770 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
17780 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
17790 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
177a0 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65  RACE(("LOCK file
177b0 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
177c0 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
177d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
177e0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
177f0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
17800 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
17810 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20   locktype));..  
17820 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
17830 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
17840 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
17850 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
17860 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
17870 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
17880 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
17890 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
178a0 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
178b0 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
178c0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
178d0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
178e0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
178f0 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
17900 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
17910 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c  CK-HELD file=%p,
17920 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17930 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17950 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
17960 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
17970 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
17980 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
17990 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
179a0 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
179b0 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
179c0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
179d0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
179e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
179f0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
17a00 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
17a10 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
17a20 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
17a30 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
17a40 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
17a50 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
17a60 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
17a70 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
17a80 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
17a90 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
17aa0 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
17ab0 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
17ac0 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
17ad0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
17ae0 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
17af0 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
17b00 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
17b10 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20  cktype;.  if(   
17b20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
17b30 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ==NO_LOCK).     
17b40 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65  || (   (locktype
17b50 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17b60 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
17b70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
17b80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a  RESERVED_LOCK)).
17b90 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74    ){.    int cnt
17ba0 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 3;.    while(
17bb0 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
17bc0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
17bd0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
17be0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
17bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e            PENDIN
17c20 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
17c30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
17c40 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20   Try 3 times to 
17c50 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20  get the pending 
17c60 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e  lock.  This is n
17c70 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20  eeded to work.  
17c80 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72      ** around pr
17c90 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79  oblems caused by
17ca0 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72   indexing and/or
17cb0 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74   anti-virus soft
17cc0 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a  ware on.      **
17cd0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
17ce0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f  ..      ** If yo
17cf0 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73  u are using this
17d00 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c   code as a model
17d10 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65   for alternative
17d20 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20   VFSes, do not. 
17d30 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69       ** copy thi
17d40 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20  s retry logic.  
17d50 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74  It is a hack int
17d60 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77  ended for Window
17d70 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  s only..      */
17d80 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
17d90 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17da0 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
17db0 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e  CE(("LOCK-PENDIN
17dc0 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  G-FAIL file=%p, 
17dd0 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74  count=%d, result
17de0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
17df0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
17e00 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20   cnt, res));.   
17e10 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
17e20 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f  ==ERROR_INVALID_
17e30 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20  HANDLE ){.      
17e40 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17e50 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
17e60 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17e70 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
17e80 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
17e90 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
17ea0 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72  =%p, count=%d, r
17eb0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
17ec0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17ed0 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33  >h, cnt, sqlite3
17ee0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
17ef0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17f10 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65  if( cnt ) sqlite
17f20 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29  3_win32_sleep(1)
17f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
17f40 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
17f50 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
17f60 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
17f70 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
17f80 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
17f90 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
17fa0 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
17fb0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
17fc0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
17fd0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
17fe0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
17ff0 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
18000 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52     res = winGetR
18010 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
18020 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
18030 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
18040 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
18050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18060 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
18070 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
18080 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
18090 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
180a0 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  D lock.  */.  if
180b0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ( locktype==RESE
180c0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  RVED_LOCK && res
180d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
180e0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
180f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
18100 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
18110 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
18120 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
18130 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44  _FLAGS, RESERVED
18140 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
18150 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
18160 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
18170 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
18180 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
18190 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
181a0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
181b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
181c0 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
181d0 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
181e0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
181f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
18200 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
18210 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
18220 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
18230 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
18240 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
18250 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
18260 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
18270 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
18280 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
18290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
182a0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
182b0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
182c0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
182d0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
182e0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
182f0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
18300 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
18310 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  E_FLAGS, SHARED_
18320 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18340 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
18350 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
18360 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
18370 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
18380 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
18390 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
183a0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
183b0 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52  );.      winGetR
183c0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
183d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
183e0 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
183f0 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
18400 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
18410 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
18420 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
18430 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
18440 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
18450 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
18460 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
18470 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
18480 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
18490 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
184a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
184b0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
184c0 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
184d0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
184e0 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
184f0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
18500 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
18510 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
18520 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
18530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
18540 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
18550 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
18560 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
18570 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
18580 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
18590 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61  FAIL file=%p, wa
185a0 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c  nted=%d, got=%d\
185b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
185c0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
185d0 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65  ype, newLocktype
185e0 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  ));.  }.  pFile-
185f0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
18600 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f  newLocktype;.  O
18610 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
18620 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
18630 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
18640 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
18650 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
18660 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
18670 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
18680 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
18690 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
186a0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
186b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
186c0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
186d0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
186e0 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
186f0 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
18700 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
18710 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
18720 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
18730 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
18740 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
18750 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
18760 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
18770 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65  esOut){.  int re
18780 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  s;.  winFile *pF
18790 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
187a0 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
187b0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
187c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
187d0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
187e0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
187f0 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
18800 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e  %p, pResOut=%p\n
18810 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65  ", pFile->h, pRe
18820 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72  sOut));..  asser
18830 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
18840 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
18850 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
18860 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b   ){.    res = 1;
18870 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
18880 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
18890 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28  =%p, result=%d (
188a0 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65  local)\n", pFile
188b0 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65  ->h, res));.  }e
188c0 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  lse{.    res = w
188d0 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
188e0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
188f0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
18900 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
18910 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
18920 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  es ){.      winU
18930 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
18940 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
18950 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
18960 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72    }.    res = !r
18970 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  es;.    OSTRACE(
18980 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
18990 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
189a0 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
189b0 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
189c0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
189d0 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28   res;.  OSTRACE(
189e0 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
189f0 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
18a00 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
18a10 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18a20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
18a30 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20  le->h, pResOut, 
18a40 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65  *pResOut));.  re
18a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18a60 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
18a70 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
18a80 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
18a90 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
18aa0 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
18ab0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
18ac0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
18ad0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
18ae0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18af0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
18b00 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
18b10 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
18b20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
18b30 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
18b40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18b50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
18b60 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
18b70 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
18b80 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
18b90 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
18ba0 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
18bb0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
18bc0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
18bd0 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
18be0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
18bf0 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
18c00 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
18c10 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
18c20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18c30 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
18c40 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
18c50 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
18c60 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
18c70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18c80 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
18c90 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
18ca0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
18cb0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18cc0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
18cd0 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63   file=%p, oldLoc
18ce0 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63  k=%d(%d), newLoc
18cf0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
18d00 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
18d10 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
18d20 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
18d30 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29  Byte, locktype))
18d40 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
18d50 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
18d60 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
18d70 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  E_LOCK ){.    wi
18d80 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
18d90 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
18da0 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
18db0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
18dc0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
18dd0 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65  D_LOCK && !winGe
18de0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
18df0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
18e00 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
18e10 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
18e20 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
18e30 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
18e40 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
18e50 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
18e60 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
18e70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
18e80 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
18e90 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
18eb0 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  nUnlock", pFile-
18ec0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
18ed0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
18ee0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
18ef0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
18f00 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
18f10 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
18f20 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
18f30 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
18f40 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
18f50 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
18f60 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
18f70 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
18f80 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
18f90 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
18fa0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
18fb0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
18fc0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
18fd0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
18fe0 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
18ff0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  e;.  OSTRACE(("U
19000 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
19010 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
19020 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
19030 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
19040 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
19050 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
19060 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19070 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
19080 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69  initially negati
19090 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ve then this is 
190a0 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70  a query.  Set *p
190b0 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30  Arg to.** 1 or 0
190c0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
190d0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74  ether or not bit
190e0 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e   mask of pFile->
190f0 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74  ctrlFlags is set
19100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ..**.** If *pArg
19110 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e   is 0 or 1, then
19120 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68   clear or set th
19130 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46  e mask bit of pF
19140 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a  ile->ctrlFlags..
19150 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
19160 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c  inModeBit(winFil
19170 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
19180 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
19190 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
191a0 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
191b0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
191c0 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
191d0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
191e0 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
191f0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
19200 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
19210 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
19220 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
19230 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
19240 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
19250 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20  s to VFS helper 
19260 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72  methods used for
19270 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19280 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
19290 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  inGetTempname(sq
192a0 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61  lite3_vfs *, cha
192b0 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  r **);.static in
192c0 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
192d0 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
192e0 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65   BOOL winIsDrive
192f0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63  LetterAndColon(c
19300 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f  onst char *);../
19310 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
19320 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
19330 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
19340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
19350 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
19360 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19370 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
19380 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
19390 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
193a0 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  )id;.  OSTRACE((
193b0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
193c0 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e  op=%d, pArg=%p\n
193d0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c  ", pFile->h, op,
193e0 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63   pArg));.  switc
193f0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
19400 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
19410 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
19420 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
19430 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
19440 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
19450 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
19460 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
19470 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
19480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19490 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
194a0 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
194b0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
194c0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
194d0 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
194e0 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  no;.      OSTRAC
194f0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19500 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
19510 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
19520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19530 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19540 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19550 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
19560 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
19570 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
19580 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54  )pArg;.      OST
19590 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
195a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
195b0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
195c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
195d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
195e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
195f0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
19600 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
19610 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
19620 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19630 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
19640 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
19650 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
19660 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
19670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19690 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
196a0 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
196b0 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
196c0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
196d0 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
196e0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
196f0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
19700 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
19710 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
19720 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
19730 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19740 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
19750 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54     }.        OST
19770 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
19780 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
19790 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
197a0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
197b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
197c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
197d0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
197e0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
197f0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
19800 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
19810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19820 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
19830 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
19840 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
19850 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
19860 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
19870 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
19880 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
19890 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
198a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
198b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
198c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
198d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
198e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
198f0 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
19900 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
19910 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
19920 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
19930 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
19940 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
19950 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
19960 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
19970 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
19980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
199a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
199b0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
199c0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
199d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
199e0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
199f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
19a00 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
19a10 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
19a20 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
19a30 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
19a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19a50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
19a60 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
19a70 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20  AV_RETRY: {.    
19a80 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a    int *a = (int*
19a90 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
19aa0 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[0]>0 ){.     
19ab0 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
19ac0 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
19ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
19ae0 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74  0] = winIoerrRet
19af0 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ry;.      }.    
19b00 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a    if( a[1]>0 ){.
19b10 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
19b20 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31  RetryDelay = a[1
19b30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
19b40 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77          a[1] = w
19b50 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
19b60 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
19b70 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
19b80 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
19b90 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
19ba0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
19bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19bc0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
19bd0 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65  TE_TEST.    case
19be0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
19bf0 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20  N32_SET_HANDLE: 
19c00 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45  {.      LPHANDLE
19c10 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e   phFile = (LPHAN
19c20 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20  DLE)pArg;.      
19c30 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20  HANDLE hOldFile 
19c40 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
19c50 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68    pFile->h = *ph
19c60 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46  File;.      *phF
19c70 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a  ile = hOldFile;.
19c80 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
19c90 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70  FCNTL oldFile=%p
19ca0 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63  , newFile=%p, rc
19cb0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4f                hO
19cd0 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  ldFile, pFile->h
19ce0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
19cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19d00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
19d10 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
19d20 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
19d30 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
19d40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
19d50 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
19d60 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
19d70 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
19d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
19da0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
19db0 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
19dc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
19dd0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19de0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
19df0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
19e00 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
19e10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
19e20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
19e30 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
19e40 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
19e50 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
19e60 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
19e70 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
19e80 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
19e90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
19ea0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
19eb0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19ec0 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
19ed0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
19ee0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19ef0 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
19f00 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41  .      *(i64*)pA
19f10 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  rg = pFile->mmap
19f20 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69  SizeMax;.      i
19f30 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26  f( newLimit>=0 &
19f40 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c  & newLimit!=pFil
19f50 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26  e->mmapSizeMax &
19f60 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f  & pFile->nFetchO
19f70 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
19f80 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19f90 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a  Max = newLimit;.
19fa0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c          if( pFil
19fb0 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  e->mmapSize>0 ){
19fc0 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e  .          winUn
19fd0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
19fe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
19ff0 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  inMapfile(pFile,
1a000 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
1a010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
1a020 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a030 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1a040 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
1a050 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a060 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a070 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1a080 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46   }.  OSTRACE(("F
1a090 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1a0a0 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
1a0b0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1a0c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a0d0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1a0e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1a0f0 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
1a100 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
1a110 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
1a120 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
1a130 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
1a140 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
1a150 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
1a160 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
1a170 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
1a180 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
1a190 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
1a1a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1a1b0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
1a1c0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
1a1d0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
1a1e0 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
1a1f0 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
1a200 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
1a210 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
1a220 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
1a230 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
1a240 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1a250 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
1a260 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
1a270 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
1a280 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1a290 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69  ile *id){.  (voi
1a2a0 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  d)id;.  return S
1a2b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1a2c0 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
1a2d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
1a2e0 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
1a2f0 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
1a300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1a310 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a320 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
1a330 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69  le *id){.  winFi
1a340 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65  le *p = (winFile
1a350 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  *)id;.  return S
1a360 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
1a370 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
1a380 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70  N |.         ((p
1a390 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
1a3a0 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49  NFILE_PSOW)?SQLI
1a3b0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1a3c0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b  FE_OVERWRITE:0);
1a3d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .}../*.** Window
1a3e0 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20  s will only let 
1a3f0 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20  you create file 
1a400 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a  view mappings.**
1a410 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73   on allocation s
1a420 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ize granularity 
1a430 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44  boundaries..** D
1a440 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73  uring sqlite3_os
1a450 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20  _init() we do a 
1a460 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a  GetSystemInfo().
1a470 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72  ** to get the gr
1a480 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a  anularity size..
1a490 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45 4d  */.static SYSTEM
1a4a0 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f  _INFO winSysInfo
1a4b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1a4c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a  E_OMIT_WAL../*.*
1a4d0 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
1a4e0 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
1a4f0 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
1a500 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
1a510 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
1a520 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
1a530 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b  tect the winLock
1a540 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65  Info objects use
1a550 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c  d by.** this fil
1a560 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
1a570 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79  may be shared by
1a580 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
1a590 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
1a5a0 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  n winShmMutexHel
1a5b0 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
1a5c0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
1a5d0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a   global mutex.**
1a5e0 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
1a5f0 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
1a600 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
1a610 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
1a620 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
1a630 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
1a640 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
1a650 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
1a660 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
1a670 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
1a680 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1a690 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
1a6a0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1a6b0 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
1a6c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1a6d0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a6e0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1a6f0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
1a700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1a710 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
1a720 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
1a730 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
1a740 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1a750 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1a760 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
1a770 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
1a780 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74  ic int winShmMut
1a790 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
1a7a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
1a7b0 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
1a7c0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1a7d0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1a7e0 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e  _MASTER));.}.#en
1a7f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  dif../*.** Objec
1a800 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
1a810 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  ent a single fil
1a820 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61  e opened and mma
1a830 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a  pped to provide.
1a840 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ** shared memory
1a850 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .  When multiple
1a860 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
1a870 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a  erence the same.
1a880 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20  ** log-summary, 
1a890 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
1a8a0 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20  its own winFile 
1a8b0 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
1a8c0 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
1a8d0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
1a8e0 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
1a8f0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
1a900 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
1a910 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
1a920 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
1a930 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77  process..**.** w
1a940 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1a950 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
1a960 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
1a970 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
1a980 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
1a990 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
1a9a0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
1a9b0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
1a9c0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20        nRef.**   
1a9d0 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54     pNext.**.** T
1a9e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1a9f0 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
1aa00 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
1aa10 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
1aa20 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a  *.**      fid.**
1aa30 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
1aa40 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
1aa50 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
1aa60 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
1aa70 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
1aa80 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
1aa90 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
1aaa0 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
1aab0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
1aac0 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
1aad0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
1aae0 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
1aaf0 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
1ab00 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1ab10 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1ab20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1ab30 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1ab40 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1ab50 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ab60 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
1ab70 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
1ab80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1ab90 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
1aba0 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
1abb0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
1abc0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1abd0 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
1abe0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1abf0 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
1ac00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ac10 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
1ac20 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
1ac30 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
1ac40 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
1ac50 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
1ac60 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
1ac70 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
1ac80 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
1ac90 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
1aca0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1acb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1acc0 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
1acd0 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
1ace0 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
1acf0 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1ad00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ad10 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
1ad20 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
1ad30 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
1ad40 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
1ad50 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
1ad60 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1ad70 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1ad80 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
1ad90 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
1ada0 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
1adb0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
1adc0 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65  bjects */.#if de
1add0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1ade0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1adf0 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
1ae00 41 43 45 29 0a 20 20 75 38 20 6e 65 78 74 53 68  ACE).  u8 nextSh
1ae10 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
1ae20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
1ae30 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
1ae40 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
1ae50 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
1ae60 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
1ae70 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
1ae80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
1ae90 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
1aea0 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
1aeb0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1aec0 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
1aed0 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
1aee0 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
1aef0 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
1af00 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
1af10 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
1af20 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
1af30 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
1af40 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
1af50 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
1af60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
1af70 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1af80 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
1af90 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
1afa0 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
1afb0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
1afc0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
1afd0 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
1afe0 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
1aff0 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
1b000 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
1b010 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
1b020 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
1b030 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1b040 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
1b050 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
1b060 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
1b070 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
1b080 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1b090 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
1b0a0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
1b0b0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1b0c0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
1b0d0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1b0e0 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
1b0f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
1b100 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
1b110 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1b120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1b130 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1b140 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
1b150 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
1b160 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1b170 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
1b180 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
1b190 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b1b0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
1b1c0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
1b1d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1b1e0 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1b1f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
1b200 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38  E_OS_TRACE).  u8
1b210 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
1b220 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
1b230 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
1b240 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68  n with its winSh
1b250 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  mNode */.#endif.
1b260 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
1b270 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
1b280 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
1b290 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28  WIN_SHM_BASE   (
1b2a0 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  (22+SQLITE_SHM_N
1b2b0 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20  LOCK)*4)        
1b2c0 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
1b2d0 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  te */.#define WI
1b2e0 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49  N_SHM_DMS    (WI
1b2f0 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  N_SHM_BASE+SQLIT
1b300 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
1b310 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
1b320 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
1b330 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
1b340 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62  or all n bytes b
1b350 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74  eginning at ofst
1b360 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48  ..*/.#define _SH
1b370 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69  M_UNLCK  1.#defi
1b380 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32  ne _SHM_RDLCK  2
1b390 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52  .#define _SHM_WR
1b3a0 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e  LCK  3.static in
1b3b0 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  t winShmSystemLo
1b3c0 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ck(.  winShmNode
1b3d0 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41   *pFile,    /* A
1b3e0 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
1b3f0 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
1b400 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
1b410 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c  .  int lockType,
1b420 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d           /* _SHM
1b430 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c  _UNLCK, _SHM_RDL
1b440 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43  CK, or _SHM_WRLC
1b450 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b470 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  Offset to first 
1b480 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
1b490 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  d/unlocked */.  
1b4a0 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20  int nByte       
1b4b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b4c0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
1b4d0 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b   or unlock */.){
1b4e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1b4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1b500 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63  lt code form Loc
1b510 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29  k/UnlockFileEx()
1b520 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
1b530 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   to the winShmNo
1b540 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
1b550 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
1b560 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
1b570 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b580 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74  _held(pFile->mut
1b590 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52  ex) || pFile->nR
1b5a0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52  ef==0 );..  OSTR
1b5b0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66  ACE(("SHM-LOCK f
1b5c0 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
1b5d0 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65   offset=%d, size
1b5e0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1b5f0 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e     pFile->hFile.
1b600 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73  h, lockType, ofs
1b610 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f  t, nByte));..  /
1b620 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72  * Release/Acquir
1b630 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  e the system-lev
1b640 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28  el lock */.  if(
1b650 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f   lockType==_SHM_
1b660 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  UNLCK ){.    rc 
1b670 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
1b680 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
1b690 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
1b6a0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
1b6b0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1b6c0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
1b6d0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57  meters */.    DW
1b6e0 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f  ORD dwFlags = LO
1b6f0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
1b700 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28  DIATELY;.    if(
1b710 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48   lockType == _SH
1b720 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67  M_WRLCK ) dwFlag
1b730 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  s |= LOCKFILE_EX
1b740 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
1b750 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69    rc = winLockFi
1b760 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
1b770 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73  .h, dwFlags, ofs
1b780 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t, 0, nByte, 0);
1b790 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
1b7a0 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53   0 ){.    rc = S
1b7b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1b7c0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
1b7d0 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74  stErrno =  osGet
1b7e0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1b7f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1b800 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  Y;.  }..  OSTRAC
1b810 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c  E(("SHM-LOCK fil
1b820 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65  e=%p, func=%s, e
1b830 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c  rrno=%lu, rc=%s\
1b840 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1b850 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28  File->hFile.h, (
1b860 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
1b870 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e  _UNLCK) ? "winUn
1b880 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20  lockFile" :.    
1b890 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46         "winLockF
1b8a0 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  ile", pFile->las
1b8b0 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45  tErrno, sqlite3E
1b8c0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20  rrName(rc)));.. 
1b8d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b8e0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1b8f0 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68  nces to VFS meth
1b900 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ods */.static in
1b910 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65  t winOpen(sqlite
1b920 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61  3_vfs*,const cha
1b930 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  r*,sqlite3_file*
1b940 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74  ,int,int*);.stat
1b950 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
1b960 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63  (sqlite3_vfs *,c
1b970 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
1b980 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
1b990 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  e winShmNodeList
1b9a0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
1b9b0 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d  ries with winShm
1b9c0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
1b9d0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
1b9e0 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
1b9f0 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
1ba00 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
1ba10 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
1ba20 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
1ba30 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
1ba40 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1ba50 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f  hmPurge(sqlite3_
1ba60 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64  vfs *pVfs, int d
1ba70 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69  eleteFlag){.  wi
1ba80 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20  nShmNode **pp;. 
1ba90 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a   winShmNode *p;.
1baa0 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
1bab0 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
1bac0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
1bad0 55 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65  URGE pid=%lu, de
1bae0 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a  leteFlag=%d\n",.
1baf0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1bb00 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1bb10 28 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29  (), deleteFlag))
1bb20 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d  ;.  pp = &winShm
1bb30 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  NodeList;.  whil
1bb40 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20  e( (p = *pp)!=0 
1bb50 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  ){.    if( p->nR
1bb60 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
1bb70 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
1bb80 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69  p->mutex ){ sqli
1bb90 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
1bba0 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20  ->mutex); }.    
1bbb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1bbc0 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
1bbd0 20 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20         BOOL bRc 
1bbe0 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  = osUnmapViewOfF
1bbf0 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  ile(p->aRegion[i
1bc00 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].pMap);.       
1bc10 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
1bc20 55 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25  URGE-UNMAP pid=%
1bc30 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72  lu, region=%d, r
1bc40 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1bc50 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1bc60 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1bc70 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22  ), i, bRc ? "ok"
1bc80 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1bc90 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41         UNUSED_VA
1bca0 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63  RIABLE_VALUE(bRc
1bcb0 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
1bcc0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
1bcd0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
1bce0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
1bcf0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
1bd00 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72  CLOSE pid=%lu, r
1bd10 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
1bd20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1bd30 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1bd40 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
1bd50 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
1bd60 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1bd70 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
1bd80 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
1bd90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bda0 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c  p->hFile.h!=NULL
1bdb0 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d   && p->hFile.h!=
1bdc0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1bdd0 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ALUE ){.        
1bde0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1bdf0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1be00 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69    winClose((sqli
1be10 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68  te3_file *)&p->h
1be20 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53  File);.        S
1be30 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1be40 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
1be50 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74  .      if( delet
1be60 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
1be70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1be80 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1be90 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
1bea0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1beb0 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65         winDelete
1bec0 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e  (pVfs, p->zFilen
1bed0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
1bee0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
1bef0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
1bf00 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1bf10 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1bf20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
1bf30 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
1bf40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1bf50 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  >aRegion);.     
1bf60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1bf70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bf80 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78     pp = &p->pNex
1bf90 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
1bfa0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
1bfb0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
1bfc0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1bfd0 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
1bfe0 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  pDbFd..**.** Whe
1bff0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
1c000 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1c010 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
1c020 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
1c030 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
1c040 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
1c050 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
1c060 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
1c070 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
1c080 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
1c090 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1c0a0 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
1c0b0 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
1c0c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1c0d0 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
1c0e0 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44  mory(winFile *pD
1c0f0 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77  bFd){.  struct w
1c100 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
1c110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c120 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1c130 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
1c140 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1c150 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20   *pShmNode = 0; 
1c160 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1c170 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
1c180 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1c1b0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72  lt code */.  str
1c1c0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
1c1d0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1c1e0 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
1c1f0 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ed winShmNode */
1c200 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c230 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20   zName in bytes 
1c240 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
1c250 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20  bFd->pShm==0 ); 
1c260 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f     /* Not previo
1c270 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a  usly opened */..
1c280 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1c290 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
1c2a0 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65  sqlite3_shm obje
1c2b0 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c  ct.  Also specul
1c2c0 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c  atively.  ** all
1c2d0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1c2e0 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65  a new winShmNode
1c2f0 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20   and filename.. 
1c300 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
1c310 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
1c320 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1c330 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1c340 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1c350 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  M;.  nName = sql
1c360 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
1c370 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
1c380 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
1c390 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1c3a0 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
1c3b0 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20  e + 17 );.  if( 
1c3c0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
1c3d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1c3e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c3f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1c400 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65   }.  pNew->zFile
1c410 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
1c420 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
1c430 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
1c440 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
1c450 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
1c460 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1c470 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
1c480 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
1c490 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1c4a0 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74  e);..  /* Look t
1c4b0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
1c4c0 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69  s an existing wi
1c4d0 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61  nShmNode that ca
1c4e0 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20  n be used..  ** 
1c4f0 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77  If no matching w
1c500 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e  inShmNode curren
1c510 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61  tly exists, crea
1c520 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
1c530 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1c540 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
1c550 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d  ShmNode = winShm
1c560 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f  NodeList; pShmNo
1c570 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68  de; pShmNode=pSh
1c580 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  mNode->pNext){. 
1c590 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74     /* TBD need t
1c5a0 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62  o come up with b
1c5b0 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65  etter match here
1c5c0 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a  .  Perhaps.    *
1c5d0 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f  * use FILE_ID_BO
1c5e0 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75  TH_DIR_INFO Stru
1c5f0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
1c600 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1c610 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ICmp(pShmNode->z
1c620 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e  Filename, pNew->
1c630 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20  zFilename)==0 ) 
1c640 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1c650 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20   pShmNode ){.   
1c660 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1c670 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ew);.  }else{.  
1c680 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65    pShmNode = pNe
1c690 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  w;.    pNew = 0;
1c6a0 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29  .    ((winFile*)
1c6b0 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  (&pShmNode->hFil
1c6c0 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  e))->h = INVALID
1c6d0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20  _HANDLE_VALUE;. 
1c6e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65     pShmNode->pNe
1c6f0 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  xt = winShmNodeL
1c700 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e  ist;.    winShmN
1c710 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f  odeList = pShmNo
1c720 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64  de;..    pShmNod
1c730 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
1c740 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1c750 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1c760 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
1c770 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1c780 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c790 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1c7a0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1c7b0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1c7c0 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1c7d0 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20  (pDbFd->pVfs,.  
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c7f0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1c800 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
1c810 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1c820 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
1c850 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1c860 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
1c870 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   here */.       
1c880 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c890 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49  _OPEN_WAL | SQLI
1c8a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1c8b0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1c8c0 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20  CREATE,.        
1c8d0 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
1c8e0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1c8f0 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
1c900 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1c910 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
1c920 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
1c930 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1c940 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
1c950 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
1c960 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
1c970 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1c980 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20   zero length..  
1c990 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e    */.    if( win
1c9a0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1c9b0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
1c9c0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1c9d0 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   1)==SQLITE_OK )
1c9e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1c9f0 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
1ca00 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1ca10 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20  de->hFile, 0);. 
1ca20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ca30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ca40 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1ca50 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1ca60 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61  SHMOPEN, osGetLa
1ca70 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
1caa0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1cab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cac0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
1cae0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1caf0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
1cb00 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1cb10 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
1cb20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1cb30 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1cb40 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
1cb50 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
1cb60 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1cb70 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1cb80 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
1cb90 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
1cba0 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
1cbb0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1cbc0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
1cbd0 68 6d 4e 6f 64 65 3b 0a 23 69 66 20 64 65 66 69  hmNode;.#if defi
1cbe0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1cbf0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1cc00 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
1cc10 45 29 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  E).  p->id = pSh
1cc20 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
1cc30 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
1cc40 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
1cc50 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
1cc60 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1cc70 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
1cc80 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1cc90 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
1cca0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
1ccb0 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
1ccc0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
1ccd0 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74  of the winShmEnt
1cce0 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
1ccf0 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
1cd00 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
1cd10 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d  w (struct winShm
1cd20 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
1cd30 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
1cd40 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
1cd50 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
1cd60 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
1cd70 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
1cd80 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
1cd90 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
1cda0 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
1cdb0 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
1cdc0 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
1cdd0 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
1cde0 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75  e->mutex.  ** mu
1cdf0 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
1ce00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1ce10 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1ce20 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
1ce30 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1ce40 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
1ce50 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
1ce60 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1ce70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1ce80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ce90 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
1cea0 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
1ceb0 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
1cec0 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
1ced0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1cee0 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
1cef0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
1cf00 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
1cf10 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
1cf20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
1cf30 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
1cf40 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
1cf50 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1cf60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1cf70 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
1cf80 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
1cf90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cfa0 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
1cfb0 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
1cfc0 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
1cfd0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1cfe0 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
1cff0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
1d000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1d010 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
1d020 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1d030 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1d040 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1d050 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1d060 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
1d070 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1d080 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67  te after closing
1d090 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1d0a0 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
1d0b0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1d0c0 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1d0d0 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d-memory */.  wi
1d0e0 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1d0f0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1d100 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
1d110 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  ed */.  winShmNo
1d120 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
1d130 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1d140 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1d150 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  le */.  winShm *
1d160 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
1d170 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1d180 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
1d190 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46  tions */..  pDbF
1d1a0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1d1b0 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
1d1c0 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
1d1d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1d1e0 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
1d1f0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
1d200 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
1d210 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
1d220 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
1d230 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
1d240 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
1d250 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
1d260 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1d270 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
1d280 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
1d290 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
1d2a0 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
1d2b0 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
1d2c0 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
1d2d0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
1d2e0 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
1d2f0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
1d300 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
1d310 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d320 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1d330 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
1d340 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
1d350 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
1d360 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
1d370 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
1d380 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1d390 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68  , too */.  winSh
1d3a0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
1d3b0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
1d3c0 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
1d3d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
1d3e0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1d3f0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1d400 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
1d410 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46  d->pVfs, deleteF
1d420 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53  lag);.  }.  winS
1d430 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1d440 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d450 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
1d460 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
1d470 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
1d480 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
1d490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1d4a0 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  inShmLock(.  sql
1d4b0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1d4c0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1d4d0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
1d4e0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1d4f0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
1d500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d510 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
1d520 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1d530 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1d540 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1d550 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d560 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
1d570 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1d580 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5a0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
1d5b0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
1d5c0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1d5d0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1d5e0 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  d;        /* Con
1d5f0 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
1d600 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1d610 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
1d620 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
1d630 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d640 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
1d650 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
1d660 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  winShm *pX;     
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1d690 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
1d6a0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53  blings */.  winS
1d6b0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1d6c0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
1d6d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d6e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1d6f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1d700 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
1d710 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d730 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
1d740 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
1d750 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
1d760 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
1d770 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
1d780 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
1d790 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
1d7a0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
1d7b0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1d7c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1d7d0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1d7e0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1d7f0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1d800 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
1d810 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1d820 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1d830 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1d840 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1d850 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1d860 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1d870 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1d880 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
1d890 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
1d8a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1d8b0 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
1d8c0 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55  mask = (u16)((1U
1d8d0 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
1d8e0 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73  U<<ofst));.  ass
1d8f0 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
1d900 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
1d910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1d920 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1d930 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
1d940 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1d950 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
1d960 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
1d970 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1d980 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
1d990 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
1d9a0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
1d9b0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
1d9c0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
1d9d0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1d9e0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1d9f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1da00 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
1da10 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1da20 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1da30 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
1da40 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
1da50 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
1da60 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
1da70 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1da80 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
1da90 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
1daa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
1dab0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
1dac0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1dad0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1dae0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
1daf0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1db00 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1db10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1db20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1db30 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
1db40 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
1db50 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1db60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1db70 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
1db80 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
1db90 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1dba0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1dbb0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
1dbc0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1dbd0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
1dbe0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
1dbf0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
1dc00 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
1dc10 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
1dc20 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
1dc30 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
1dc40 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
1dc50 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
1dc60 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1dc70 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
1dc80 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
1dc90 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
1dca0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
1dcb0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
1dcc0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
1dcd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1dce0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1dcf0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1dd00 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1dd10 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1dd20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1dd30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dd40 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1dd50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1dd60 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
1dd70 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1dd80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1dd90 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
1dda0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
1ddb0 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
1ddc0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
1ddd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dde0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
1ddf0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
1de00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1de10 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1de20 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
1de30 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
1de40 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1de50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1de60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1de70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1de80 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1de90 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
1dea0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
1deb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dec0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
1ded0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
1dee0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1def0 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
1df00 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1df10 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
1df20 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
1df30 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
1df40 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
1df50 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
1df60 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
1df70 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1df80 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1df90 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1dfa0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1dfb0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1dfc0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
1dfd0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
1dfe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1dff0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1e000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e020 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
1e030 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
1e040 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1e050 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
1e060 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
1e070 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
1e080 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
1e090 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
1e0a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1e0b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e0c0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1e0d0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1e0e0 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f  e, _SHM_WRLCK, o
1e0f0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1e100 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
1e110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e120 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e130 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
1e140 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
1e150 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
1e160 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1e170 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
1e180 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e190 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1e1a0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
1e1b0 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c  "SHM-LOCK pid=%l
1e1c0 75 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64  u, id=%d, shared
1e1d0 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d  Mask=%03x, exclM
1e1e0 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c  ask=%03x, rc=%s\
1e1f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1e200 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1e210 73 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70  ssId(), p->id, p
1e220 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d  ->sharedMask, p-
1e230 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20  >exclMask,.     
1e240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1e250 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
1e260 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e270 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
1e280 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
1e290 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
1e2a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a  shared memory..*
1e2b0 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
1e2c0 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
1e2d0 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
1e2e0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
1e2f0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
1e300 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
1e310 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
1e320 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
1e330 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
1e340 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
1e350 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
1e360 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1e370 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1e380 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
1e390 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1e3a0 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
1e3b0 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
1e3c0 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
1e3d0 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
1e3e0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
1e3f0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
1e400 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1e410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e420 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e430 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
1e440 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
1e450 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  iRegion of the.*
1e460 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
1e470 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e490 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
1e4a0 6f 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20 61  ory regions.** a
1e4b0 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
1e4c0 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
1e4d0 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
1e4e0 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
1e4f0 65 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20 69  egion.** bytes i
1e500 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
1e510 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e520 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1e530 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e540 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
1e550 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
1e560 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72  ise, if the isWr
1e570 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ite parameter is
1e580 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
1e590 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
1e5a0 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
1e5b0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1e5c0 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
1e5d0 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
1e5e0 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
1e5f0 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
1e600 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
1e610 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1e620 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1e630 6e 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72 69  ned. If.** isWri
1e640 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  te is non-zero a
1e650 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1e660 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1e670 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
1e680 74 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61  t.** been alloca
1e690 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
1e6a0 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
1e6b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1e6c0 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
1e6d0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
1e6e0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
1e6f0 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
1e700 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
1e710 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
1e720 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
1e730 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
1e740 68 69 73 20 70 72 6f 63 65 73 73 65 73 0a 2a 2a  his processes.**
1e750 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
1e760 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1e770 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
1e780 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1e790 65 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f  e mapped.** memo
1e7a0 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
1e7b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1e7c0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
1e7d0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1e7e0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1e7f0 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1e800 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
1e810 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
1e820 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
1e830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e840 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
1e850 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
1e860 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1e870 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1e880 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
1e890 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20  t isWrite,      
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8b0 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
1e8c0 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
1e8d0 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
1e8e0 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
1e8f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1e900 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
1e910 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1e920 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
1e930 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53  fd;.  winShm *pS
1e940 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  hm = pDbFd->pShm
1e950 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1e960 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1e970 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e980 0a 20 20 69 66 28 20 21 70 53 68 6d 20 29 7b 0a  .  if( !pShm ){.
1e990 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1e9a0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
1e9b0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
1e9c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1e9d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 53 68 6d  urn rc;.    pShm
1e9e0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1e9f0 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d    }.  pShmNode =
1ea00 20 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65 3b   pShm->pShmNode;
1ea10 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
1ea20 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1ea30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1ea40 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
1ea50 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1ea60 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
1ea70 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69  egion==0 );..  i
1ea80 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1ea90 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1eaa0 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52  .    struct ShmR
1eab0 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20  egion *apNew;   
1eac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
1ead0 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
1eae0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
1eaf0 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
1eb00 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
1eb10 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
1eb20 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  e size */.    sq
1eb30 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20  lite3_int64 sz; 
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
1eb60 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69   of wal-index fi
1eb70 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  le */..    pShmN
1eb80 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
1eb90 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f  szRegion;..    /
1eba0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1ebb0 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
1ebc0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1ebd0 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
1ebe0 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43   space..    ** C
1ebf0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
1ec00 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
1ec10 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
1ec20 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
1ec30 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65   is.    ** large
1ec40 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
1ec50 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1ec60 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f   region)..    */
1ec70 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1ec80 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1ec90 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1eca0 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20  >hFile, &sz);.  
1ecb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ecc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1ecd0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1ece0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1ecf0 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1ed00 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1ed20 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64  nShmMap1", pDbFd
1ed30 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1ed40 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1ed50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1ed60 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20   sz<nByte ){.   
1ed70 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1ed80 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1ed90 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
1eda0 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20  . If isWrite is 
1edb0 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  set to.      ** 
1edc0 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79  zero, exit early
1edd0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
1ede0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1edf0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1ee00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1ee10 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
1ee20 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73  y, if isWrite is
1ee30 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66   non-zero, use f
1ee40 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c  truncate() to al
1ee50 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  locate.      ** 
1ee60 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1ee70 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20  mory region..   
1ee80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1ee90 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20  !isWrite ) goto 
1eea0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1eeb0 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
1eec0 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
1eed0 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
1eee0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1eef0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ef00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ef10 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1ef20 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1ef30 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
1ef40 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c     "winShmMap2",
1ef70 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1ef80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1ef90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1efa0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1efb0 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
1efc0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1efd0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1efe0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1eff0 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
1f000 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67  = (struct ShmReg
1f010 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65  ion *)sqlite3_re
1f020 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20  alloc64(.       
1f030 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1f040 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
1f050 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
1f060 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1f070 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
1f080 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1f090 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
1f0a0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1f0b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
1f0c0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
1f0d0 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
1f0e0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1f0f0 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
1f100 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
1f110 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
1f120 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
1f130 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
1f140 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
1f150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1f160 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
1f170 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53 51  egion */..#if SQ
1f180 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1f190 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1f1a0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
1f1b0 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  omApp(pShmNode->
1f1c0 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
1f1d0 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45     NULL, PAGE_RE
1f1e0 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20  ADWRITE, nByte, 
1f1f0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1f200 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1f210 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1f220 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  E).      hMap = 
1f230 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1f240 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingW(pShmNode->h
1f250 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
1f260 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1f270 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1f280 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1f290 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1f2a0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1f2b0 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20  NSI).      hMap 
1f2c0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1f2d0 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d  ppingA(pShmNode-
1f2e0 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
1f2f0 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1f300 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
1f310 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
1f320 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
1f330 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1f340 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
1f350 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65   region=%d, size
1f360 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1f380 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f390 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
1f3a0 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c  >nRegion, nByte,
1f3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f3c0 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  hMap ? "ok" : "f
1f3d0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1f3e0 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
1f3f0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
1f400 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  = pShmNode->nReg
1f410 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
1f420 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
1f430 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
1f440 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1f450 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
1f460 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54  arity;.#if SQLIT
1f470 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1f480 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
1f490 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
1f4a0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1f4b0 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1f4c0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1f4d0 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66     iOffset - iOf
1f4e0 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
1f4f0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
1f500 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
1f510 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70  lse.        pMap
1f520 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1f530 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  le(hMap, FILE_MA
1f540 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
1f550 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
1f560 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20       0, iOffset 
1f570 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
1f580 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
1f590 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
1f5a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1f5b0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1f5c0 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  MAP-MAP pid=%lu,
1f5d0 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73   region=%d, offs
1f5e0 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20  et=%d, size=%d, 
1f5f0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1f600 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1f610 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1f620 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
1f630 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a  egion, iOffset,.
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20   szRegion, pMap 
1f660 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1f670 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
1f680 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a     if( !pMap ){.
1f690 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1f6a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1f6b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1f6c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1f6d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1f6e0 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53  IOERR_SHMMAP, pS
1f6f0 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
1f700 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1f710 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1f720 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d  ShmMap3", pDbFd-
1f730 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
1f740 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c   if( hMap ) osCl
1f750 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b  oseHandle(hMap);
1f760 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
1f770 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1f780 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   }..      pShmNo
1f790 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
1f7a0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70  Node->nRegion].p
1f7b0 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20  Map = pMap;.    
1f7c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1f7d0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1f7e0 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d  egion].hMap = hM
1f7f0 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
1f800 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
1f810 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
1f820 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
1f830 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
1f840 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  Region ){.    in
1f850 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67  t iOffset = iReg
1f860 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
1f870 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
1f880 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
1f890 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
1f8a0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
1f8b0 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  y;.    char *p =
1f8c0 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64   (char *)pShmNod
1f8d0 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69  e->aRegion[iRegi
1f8e0 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70  on].pMap;.    *p
1f8f0 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69  p = (void *)&p[i
1f900 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20  OffsetShift];.  
1f910 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
1f920 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1f930 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1f940 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1f950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f960 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
1f970 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  inShmMap     0.#
1f980 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f   define winShmLo
1f990 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
1f9a0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30   winShmBarrier 0
1f9b0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1f9c0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
1f9d0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
1f9e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
1f9f0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20  /*.** Cleans up 
1fa00 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f  the mapped regio
1fa10 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  n of the specifi
1fa20 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e  ed file, if any.
1fa30 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
1fa40 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
1fa50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d  tatic int winUnm
1fa60 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
1fa70 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74  pFile){.  assert
1fa80 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
1fa90 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1faa0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1fab0 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
1fac0 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
1fad0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d  ".           "mm
1fae0 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61  apSize=%lld, mma
1faf0 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64  pSizeActual=%lld
1fb00 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c  , mmapSizeMax=%l
1fb10 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
1fb20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1fb30 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1fb40 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70  , pFile->hMap, p
1fb50 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1fb60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1fb70 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46  le->mmapSize, pF
1fb80 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
1fb90 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ual, pFile->mmap
1fba0 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28  SizeMax));.  if(
1fbb0 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1fbc0 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  on ){.    if( !o
1fbd0 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
1fbe0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1fbf0 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  on) ){.      pFi
1fc00 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1fc10 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1fc20 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1fc30 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1fc40 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1fc50 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
1fc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc70 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  "rc=SQLITE_IOERR
1fc80 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43  _MMAP\n", osGetC
1fc90 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1fca0 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20  ), pFile,.      
1fcb0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1fcc0 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20  pMapRegion));.  
1fcd0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
1fce0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1fcf0 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
1fd00 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69       "winUnmapfi
1fd30 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  le1", pFile->zPa
1fd40 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
1fd50 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1fd60 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
1fd70 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
1fd80 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1fd90 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
1fda0 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
1fdb0 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map!=NULL ){.   
1fdc0 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e   if( !osCloseHan
1fdd0 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29  dle(pFile->hMap)
1fde0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1fdf0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1fe00 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1fe10 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
1fe20 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1fe30 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
1fe40 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  p=%p, rc=SQLITE_
1fe50 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20  IOERR_MMAP\n",. 
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1fe70 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1fe80 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
1fe90 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20  ile->hMap));.   
1fea0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
1feb0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1fec0 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
1fed0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
1ff00 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
1ff10 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
1ff20 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
1ff30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
1ff40 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1ff50 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1ff60 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1ff70 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1ff80 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ff90 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20  d(), pFile));.  
1ffa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ffb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
1ffc0 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
1ffd0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
1ffe0 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
1fff0 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
20000 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
20010 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
20020 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
20030 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
20040 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a   new). Or, if.**
20050 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   there already e
20060 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20  xists a mapping 
20070 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61  for this file, a
20080 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69  nd there are sti
20090 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  ll.** outstandin
200a0 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
200b0 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
200c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
200d0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
200e0 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
200f0 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
20100 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
20110 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
20120 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67  f.** the mapping
20130 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
20140 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
20150 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
20160 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72  o, then the.** r
20170 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
20180 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20190 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
201a0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
201b0 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
201c0 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
201d0 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
201e0 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
201f0 75 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  ue configured.**
20200 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
20210 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77  NTL_MMAP_SIZE, w
20220 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
20230 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
20240 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20250 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
20260 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
20270 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
20280 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
20290 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
202a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
202b0 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
202c0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
202d0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
202e0 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69  tic int winMapfi
202f0 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c  le(winFile *pFd,
20300 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
20310 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Byte){.  sqlite3
20320 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42  _int64 nMap = nB
20330 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  yte;.  int rc;..
20340 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d    assert( nMap>=
20350 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68  0 || pFd->nFetch
20360 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52  Out==0 );.  OSTR
20370 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70  ACE(("MAP-FILE p
20380 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
20390 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a  , size=%lld\n",.
203a0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
203b0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
203c0 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29  (), pFd, nByte))
203d0 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  ;..  if( pFd->nF
203e0 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
203f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
20400 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
20410 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
20420 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
20430 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a  e*)pFd, &nMap);.
20440 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
20450 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
20460 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
20470 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
20480 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c  ITE_IOERR_FSTAT\
20490 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
204a0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
204b0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
204c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
204d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
204e0 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  AT;.    }.  }.  
204f0 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d  if( nMap>pFd->mm
20500 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20  apSizeMax ){.   
20510 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61   nMap = pFd->mma
20520 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20  pSizeMax;.  }.  
20530 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65  nMap &= ~(sqlite
20540 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49  3_int64)(winSysI
20550 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d  nfo.dwPageSize -
20560 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70   1);..  if( nMap
20570 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70  ==0 && pFd->mmap
20580 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69  Size>0 ){.    wi
20590 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
205a0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21  .  }.  if( nMap!
205b0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
205c0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
205d0 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20   = 0;.    DWORD 
205e0 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
205f0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f  EADONLY;.    DWO
20600 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f  RD flags = FILE_
20610 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77  MAP_READ;..    w
20620 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
20630 3b 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e  ;.    if( (pFd->
20640 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
20650 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
20660 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20  {.      protect 
20670 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  = PAGE_READWRITE
20680 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
20690 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b   FILE_MAP_WRITE;
206a0 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
206b0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
206c0 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65  Fd->hMap = osCre
206d0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
206e0 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55  omApp(pFd->h, NU
206f0 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61  LL, protect, nMa
20700 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  p, NULL);.#elif 
20710 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
20720 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
20730 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
20740 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
20750 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngW(pFd->h, NULL
20760 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20780 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
20790 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
207a0 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
207d0 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
207e0 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
207f0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
20800 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
20810 4e 53 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d  NSI).    pFd->hM
20820 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
20830 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68  eMappingA(pFd->h
20840 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
20850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e   (DWORD)((nMap>>
20880 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66  32) & 0xffffffff
20890 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20     (DWORD)(nMap 
208c0 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e  & 0xffffffff), N
208d0 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
208e0 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d   if( pFd->hMap==
208f0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46  NULL ){.      pF
20900 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
20910 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
20920 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
20930 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
20940 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e  OERR_MMAP, pFd->
20950 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c    "winMapfile1",
20980 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20   pFd->zPath);.  
20990 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65      /* Log the e
209a0 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e  rror, but contin
209b0 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ue normal operat
209c0 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f  ion using xRead/
209d0 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  xWrite */.      
209e0 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
209f0 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c  LE-CREATE pid=%l
20a00 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
20a10 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
20a20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20a30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
20a40 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
20a50 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
20a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20a80 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53  rt( (nMap % winS
20a90 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
20aa0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  e)==0 );.    ass
20ab0 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45  ert( sizeof(SIZE
20ac0 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69  _T)==sizeof(sqli
20ad0 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d  te3_int64) || nM
20ae0 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29  ap<=0xffffffff )
20af0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
20b00 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d  WINRT.    pNew =
20b10 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
20b20 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61  FromApp(pFd->hMa
20b30 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49  p, flags, 0, (SI
20b40 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73  ZE_T)nMap);.#els
20b50 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  e.    pNew = osM
20b60 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64  apViewOfFile(pFd
20b70 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
20b80 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61  , 0, (SIZE_T)nMa
20b90 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  p);.#endif.    i
20ba0 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
20bb0 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
20bc0 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b  ndle(pFd->hMap);
20bd0 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  .      pFd->hMap
20be0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70   = NULL;.      p
20bf0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
20c00 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
20c10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
20c20 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
20c30 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
20c40 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c60 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22     "winMapfile2"
20c70 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
20c80 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
20c90 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
20ca0 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
20cb0 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
20cc0 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
20cd0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
20ce0 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  ILE-MAP pid=%lu,
20cf0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
20d00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20d10 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20d20 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
20d30 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
20d40 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
20d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20d60 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70      }.    pFd->p
20d70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77  MapRegion = pNew
20d80 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
20d90 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20  ize = nMap;.    
20da0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
20db0 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a  ual = nMap;.  }.
20dc0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50  .  OSTRACE(("MAP
20dd0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
20de0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
20df0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
20e00 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20e10 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
20e20 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d));.  return SQ
20e30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
20e40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
20e50 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
20e60 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
20e70 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
20e80 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
20e90 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
20ea0 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
20eb0 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
20ec0 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
20ed0 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
20ee0 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
20ef0 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
20f00 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
20f10 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
20f20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
20f30 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
20f40 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
20f50 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
20f60 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
20f70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
20f80 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
20f90 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
20fa0 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
20fb0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
20fc0 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
20fd0 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
20fe0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
20ff0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
21000 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
21010 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
21020 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
21030 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
21040 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65  ually.** release
21050 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62   the reference b
21060 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66  y calling winUnf
21070 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
21080 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73  c int winFetch(s
21090 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
210a0 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e   i64 iOff, int n
210b0 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b  Amt, void **pp){
210c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
210d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
210e0 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
210f0 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
21100 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
21110 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
21120 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
21130 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  ;..  OSTRACE(("F
21140 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
21150 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
21160 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  lld, amount=%d, 
21170 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  pp=%p\n",.      
21180 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21190 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
211a0 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70  , iOff, nAmt, pp
211b0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
211c0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
211d0 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
211e0 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20  izeMax>0 ){.    
211f0 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
21200 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
21210 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66  int rc = winMapf
21220 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20  ile(pFd, -1);.  
21230 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21250 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
21260 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
21270 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
21290 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
212a0 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c  ssId(), pFd, sql
212b0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
212c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
212d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
212e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
212f0 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
21300 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
21310 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
21320 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
21330 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
21340 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
21350 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
21360 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
21370 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
21380 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d  =%p, pp=%p, *pp=
21390 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
213a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
213b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
213c0 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c  essId(), fd, pp,
213d0 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e   *pp));.  return
213e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
213f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72  *.** If the thir
21400 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
21410 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  n-NULL, then thi
21420 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61  s function relea
21430 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e  ses a.** referen
21440 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
21450 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
21460 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68  o winFetch(). Th
21470 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
21480 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
21490 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
214a0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
214b0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
214c0 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  ng.** argument t
214d0 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74  hat was passed t
214e0 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28 29  o the winFetch()
214f0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a   invocation..**.
21500 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68  ** Or, if the th
21510 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
21520 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
21530 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
21540 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69  g called.** to i
21550 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
21560 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
21570 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
21580 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
21590 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  ng.** may now be
215a0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
215b0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
215c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
215d0 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65  inUnfetch(sqlite
215e0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
215f0 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  iOff, void *p){.
21600 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
21610 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
21620 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
21630 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
21640 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
21650 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
21660 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
21670 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
21680 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
21690 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
216a0 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74  anding.  ** xFet
216b0 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
216c0 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
216d0 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
216e0 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
216f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
21700 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
21710 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
21720 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21730 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
21740 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
21750 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
21760 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
21770 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
21780 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
21790 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
217a0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
217b0 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  f] );..  OSTRACE
217c0 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25  (("UNFETCH pid=%
217d0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66  lu, pFile=%p, of
217e0 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c  fset=%lld, p=%p\
217f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
21800 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
21810 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66  ssId(), pFd, iOf
21820 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70  f, p));..  if( p
21830 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65   ){.    pFd->nFe
21840 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73  tchOut--;.  }els
21850 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  e{.    /* FIXME:
21860 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75    If Windows tru
21870 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e  ly always preven
21880 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72  ts truncating or
21890 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20   deleting a.    
218a0 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20  ** file while a 
218b0 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c  mapping is held,
218c0 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
218d0 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  ing winUnmapfile
218e0 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69  () call.    ** i
218f0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61  s unnecessary ca
21900 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70  n be omitted - p
21910 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f  otentially impro
21920 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66  ving.    ** perf
21930 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20  ormance.  */.   
21940 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
21950 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
21960 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
21970 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  t>=0 );.#endif..
21980 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
21990 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
219a0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
219b0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
219c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
219d0 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29 29  rocessId(), fd))
219e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
219f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
21a00 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
21a10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
21a20 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
21a30 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
21a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a50 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
21a60 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
21a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
21a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
21ae0 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
21af0 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
21b00 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
21b10 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
21b20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
21b30 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
21b40 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
21b50 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
21b60 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c  oMethod = {.  3,
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b90 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
21ba0 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  inClose,        
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21bc0 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69  * xClose */.  wi
21bd0 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  nRead,          
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21bf0 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57   xRead */.  winW
21c00 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
21c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21c20 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72  Write */.  winTr
21c30 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
21c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
21c50 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e  runcate */.  win
21c60 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c80 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69  xSync */.  winFi
21c90 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
21ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
21cb0 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  ileSize */.  win
21cc0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ce0 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e  xLock */.  winUn
21cf0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
21d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
21d10 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68  nlock */.  winCh
21d20 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
21d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
21d40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
21d50 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e   */.  winFileCon
21d60 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
21d70 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
21d80 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65  ntrol */.  winSe
21d90 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
21da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
21db0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77  ectorSize */.  w
21dc0 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
21dd0 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f  ristics,       /
21de0 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
21df0 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69  eristics */.  wi
21e00 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e20 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69   xShmMap */.  wi
21e30 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  nShmLock,       
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e50 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77   xShmLock */.  w
21e60 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  inShmBarrier,   
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e80 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
21e90 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20  .  winShmUnmap, 
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
21ec0 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20  */.  winFetch,  
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
21ef0 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20  /.  winUnfetch  
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
21f20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  */.};../********
21f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f70 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
21f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21f90 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
21fa0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
21fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21fc0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
21fd0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
21fe0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
21ff0 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
22000 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
22010 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
22020 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
22030 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f  GWIN__)./*.** Co
22040 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65  nvert a filename
22050 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74   from whatever t
22060 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
22070 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a  erating system.*
22080 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66  * supports for f
22090 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54  ilenames into UT
220a0 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
220b0 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20 69  old the result i
220c0 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
220d0 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
220e0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
220f0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
22100 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
22110 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54  har *winConvertT
22120 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  oUtf8Filename(co
22130 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
22140 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  ame){.  char *zC
22150 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
22160 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
22170 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
22180 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
22190 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  8(zFilename);.  
221a0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
221b0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
221c0 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
221d0 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
221e0 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
221f0 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  f8(zFilename);. 
22200 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
22210 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
22220 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
22230 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
22240 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  verted;.}.#endif
22250 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
22260 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65  a UTF-8 filename
22270 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
22280 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  orm the underlyi
22290 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  ng.** operating 
222a0 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c  system wants fil
222b0 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63  enames in.  Spac
222c0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
222d0 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69  sult.** is obtai
222e0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
222f0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
22300 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
22310 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
22320 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
22330 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
22340 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
22350 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
22360 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
22370 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f  ted = 0;.  if( o
22380 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a  sIsNT() ){.    z
22390 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55  Converted = winU
223a0 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
223b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66  lename);.  }.#if
223c0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
223d0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
223e0 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
223f0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
22400 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46  _utf8_to_mbcs(zF
22410 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  ilename);.  }.#e
22420 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72  ndif.  /* caller
22430 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74   will handle out
22440 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
22450 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65  return zConverte
22460 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
22470 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22480 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
22490 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46 2d  e specified UTF-
224a0 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a  8 string buffer.
224b0 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20 64  ** ends with a d
224c0 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
224d0 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f 72 20  or character or 
224e0 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73 73 66  one was successf
224f0 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f  ully.** added to
22500 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
22510 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44  nt winMakeEndInD
22520 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20  irSep(int nBuf, 
22530 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69  char *zBuf){.  i
22540 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69  f( zBuf ){.    i
22550 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65  nt nLen = sqlite
22560 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
22570 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20  .    if( nLen>0 
22580 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e  ){.      if( win
22590 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c  IsDirSep(zBuf[nL
225a0 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  en-1]) ){.      
225b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
225c0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e    }else if( nLen
225d0 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  +1<nBuf ){.     
225e0 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20     zBuf[nLen] = 
225f0 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a  winGetDirSep();.
22600 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65          zBuf[nLe
22610 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  n+1] = '\0';.   
22620 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22640 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22650 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
22660 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
22670 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  me and store the
22680 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74   resulting point
22690 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a  er into pzBuf..*
226a0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
226b0 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20  turned in pzBuf 
226c0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76 69  must be freed vi
226d0 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  a sqlite3_free()
226e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
226f0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73  winGetTempname(s
22700 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
22710 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b  , char **pzBuf){
22720 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
22730 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
22740 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
22750 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
22760 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
22770 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
22780 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
22790 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69  size_t i, j;.  i
227a0 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65  nt nPre = sqlite
227b0 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45  3Strlen30(SQLITE
227c0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
227d0 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20  X);.  int nMax, 
227e0 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e  nBuf, nDir, nLen
227f0 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ;.  char *zBuf;.
22800 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
22810 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
22820 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
22830 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
22840 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
22850 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
22860 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
22870 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
22880 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
22890 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
228a0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ng..  */.  Simul
228b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
228c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  rn SQLITE_IOERR 
228d0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
228e0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  e a temporary bu
228f0 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68  ffer to store th
22900 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
22910 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65  d file.  ** name
22920 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
22930 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69  ry file.  If thi
22940 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e  s fails, we cann
22950 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a  ot continue..  *
22960 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d  /.  nMax = pVfs-
22970 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75  >mxPathname; nBu
22980 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20  f = nMax + 2;.  
22990 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61  zBuf = sqlite3Ma
229a0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29  llocZero( nBuf )
229b0 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b  ;.  if( !zBuf ){
229c0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
229d0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
229e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
229f0 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  EM\n"));.    ret
22a00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22a10 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
22a20 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
22a30 20 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f   effective tempo
22a40 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
22a50 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66   First, check if
22a60 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65   one.  ** has be
22a70 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65  en explicitly se
22a80 74 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61  t by the applica
22a90 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c  tion; otherwise,
22aa0 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a   use the one.  *
22ab0 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
22ac0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
22ad0 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69  stem..  */.  nDi
22ae0 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65  r = nMax - (nPre
22af0 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74   + 15);.  assert
22b00 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66  ( nDir>0 );.  if
22b10 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
22b20 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
22b30 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71  int nDirLen = sq
22b40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
22b50 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
22b60 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e  tory);.    if( n
22b70 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  DirLen>0 ){.    
22b80 20 20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53    if( !winIsDirS
22b90 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ep(sqlite3_temp_
22ba0 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65  directory[nDirLe
22bb0 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n-1]) ){.       
22bc0 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20   nDirLen++;.    
22bd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44    }.      if( nD
22be0 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20  irLen>nDir ){.  
22bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22c00 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22c10 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22c20 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22c30 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
22c40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
22c50 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22c60 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e  E_ERROR, 0, "win
22c70 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30  GetTempname1", 0
22c80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22c90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22ca0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22cb0 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  s", sqlite3_temp
22cc0 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
22cd0 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e   }.  }.#if defin
22ce0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
22cf0 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69   else{.    stati
22d00 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
22d10 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
22d20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
22d30 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20  SQLITE_TMPDIR") 
22d40 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
22d50 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
22d60 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
22d70 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a   getenv("TMP") *
22d80 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
22d90 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f  etenv("TEMP") */
22da0 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
22db0 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c  tenv("USERPROFIL
22dc0 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f  E") */.       "/
22dd0 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20  var/tmp",.      
22de0 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
22df0 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
22e00 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30     ".",.       0
22e10 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
22e20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
22e30 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65    };.    unsigne
22e40 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e  d int i;.    con
22e50 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
22e60 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44  0;..    if( !azD
22e70 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b  irs[0] ) azDirs[
22e80 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  0] = getenv("SQL
22e90 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
22ea0 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
22eb0 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
22ec0 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
22ed0 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
22ee0 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20  [2] ) azDirs[2] 
22ef0 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b  = getenv("TMP");
22f00 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
22f10 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20  [3] ) azDirs[3] 
22f20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29  = getenv("TEMP")
22f30 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
22f40 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d  s[4] ) azDirs[4]
22f50 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50   = getenv("USERP
22f60 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f  ROFILE");.    fo
22f70 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
22f80 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
22f90 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d  zDirs[0]); zDir=
22fa0 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20  azDirs[i++]){.  
22fb0 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65      void *zConve
22fc0 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20  rted;.      if( 
22fd0 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zDir==0 ) contin
22fe0 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ue;.      /* If 
22ff0 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20  the path starts 
23000 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74  with a drive let
23010 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ter followed by 
23020 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20  the colon.      
23030 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73  ** character, as
23040 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61  sume it is alrea
23050 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  dy a native Win3
23060 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73  2 path; otherwis
23070 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  e,.      ** it m
23080 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ust be converted
23090 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e   to a native Win
230a0 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20  32 path via the 
230b0 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20  Cygwin API.     
230c0 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69   ** prior to usi
230d0 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ng it..      */.
230e0 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
230f0 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
23100 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20  on(zDir) ){.    
23110 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
23120 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
23130 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72  tf8Filename(zDir
23140 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
23150 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20  zConverted ){.  
23160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23170 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
23180 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23190 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
231a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
231b0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
231c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
231d0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
231e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
231f0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
23200 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
23210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
23220 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
23230 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b  uf, "%s", zDir);
23240 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23250 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
23260 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
23270 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
23280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23290 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
232a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
232b0 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65         zConverte
232c0 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  d = sqlite3Mallo
232d0 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b  cZero( nMax+1 );
232e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
232f0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
23300 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23310 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23320 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
23330 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
23340 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
23350 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
23360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23370 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
23380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23390 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
233a0 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
233b0 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20       osIsNT() ? 
233c0 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
233d0 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
233e0 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20  O_WIN_A, zDir,. 
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
23400 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b  Converted, nMax+
23410 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1)<0 ){.        
23420 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23430 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
23440 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23450 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23460 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
23470 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
23480 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
23490 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20  PATH\n"));.     
234a0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
234b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
234c0 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OERR_CONVPATH, (
234d0 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
23500 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69  tTempname2", zDi
23510 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
23520 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
23530 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
23540 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
23550 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
23560 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64   know the candid
23570 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78  ate directory ex
23580 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a  ists and should.
23590 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
235a0 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  used.  However, 
235b0 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63  we may need to c
235c0 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e  onvert the strin
235d0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  g containing.   
235e0 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61         ** its na
235f0 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69  me into UTF-8 (i
23600 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46  .e. if it is UTF
23610 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a  -16 right now)..
23620 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23630 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74         char *zUt
23640 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
23650 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43  oUtf8Filename(zC
23660 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
23670 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
23680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
23690 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
236a0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
236b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
236c0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
236d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
236e0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
236f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23700 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
23710 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23720 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
23730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23740 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
23750 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
23760 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
23770 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23780 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
23790 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
237a0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
237b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
237c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
237d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
237e0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
237f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23800 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45   }.#elif !SQLITE
23810 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
23820 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
23830 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49  ).  else if( osI
23840 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
23850 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c  r *zMulti;.    L
23860 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20  PWSTR zWidePath 
23870 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
23880 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66  ero( nMax*sizeof
23890 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69  (WCHAR) );.    i
238a0 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b  f( !zWidePath ){
238b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
238c0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
238d0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
238e0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
238f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
23900 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
23910 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
23920 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
23930 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
23940 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61  hW(nMax, zWidePa
23950 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
23960 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
23970 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73  dePath);.      s
23980 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
23990 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
239a0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
239b0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
239c0 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
239d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
239e0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
239f0 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
23a00 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
23a10 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
23a40 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  2", 0);.    }.  
23a50 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e    zMulti = winUn
23a60 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
23a70 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
23a80 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
23a90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23aa0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
23ab0 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
23ac0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23ad0 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
23ae0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
23af0 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Path);.    }else
23b00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
23b10 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
23b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23b30 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
23b40 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
23b50 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
23b60 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
23b70 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
23b80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
23b90 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
23ba0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
23bb0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
23bc0 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
23bd0 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a  Utf8;.    char *
23be0 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69  zMbcsPath = sqli
23bf0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
23c00 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21  Max );.    if( !
23c10 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20  zMbcsPath ){.   
23c20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23c30 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
23c40 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
23c50 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
23c60 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
23c70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23c80 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
23c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23ca0 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e  osGetTempPathA(n
23cb0 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d  Max, zMbcsPath)=
23cc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
23cd0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23ce0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23cf0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23d00 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
23d10 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
23d20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
23d30 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
23d40 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
23d50 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
23d60 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
23d80 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c  inGetTempname3",
23d90 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
23da0 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77  Utf8 = sqlite3_w
23db0 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
23dc0 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  8(zMbcsPath);.  
23dd0 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20    if( zUtf8 ){. 
23de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
23df0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
23e00 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
23e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23e20 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d  ee(zUtf8);.    }
23e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
23e40 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23e50 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23e60 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23e70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
23e80 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
23e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23ea0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
23eb0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
23ec0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
23ed0 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ANSI */.#endif /
23ee0 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  * !SQLITE_OS_WIN
23ef0 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  RT */..  /*.  **
23f00 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
23f10 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ure the temporar
23f20 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73  y directory ends
23f30 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72   with an appropr
23f40 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61  iate.  ** separa
23f50 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73  tor.  If it does
23f60 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69   not and there i
23f70 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61  s not enough spa
23f80 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20  ce left to add. 
23f90 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20   ** one, fail.. 
23fa0 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61   */.  if( !winMa
23fb0 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44  keEndInDirSep(nD
23fc0 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20  ir+1, zBuf) ){. 
23fd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23fe0 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41  zBuf);.    OSTRA
23ff0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
24000 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
24010 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  OR\n"));.    ret
24020 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
24030 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
24040 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
24050 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  4", 0);.  }..  /
24060 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61  *.  ** Check tha
24070 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
24080 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
24090 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
240a0 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a 20  orary file.  ** 
240b0 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c  name in the foll
240c0 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20  owing format:.  
240d0 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70  **.  **   "<temp
240e0 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e  orary_directory>
240f0 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58  /etilqs_XXXXXXXX
24100 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a  XXXXXXX\0\0".  *
24110 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72  *.  ** If not, r
24120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
24130 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  OR.  The number 
24140 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20  17 is used here 
24150 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
24160 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
24170 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
24180 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20  he 15 character 
24190 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e  random suffix an
241a0 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74  d the.  ** two t
241b0 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72  railing NUL char
241c0 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e  acters.  The fin
241d0 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70  al directory sep
241e0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
241f0 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  .  ** has alread
24200 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61  y added if it wa
24210 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72  s not already pr
24220 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c  esent..  */.  nL
24230 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
24240 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66  en30(zBuf);.  if
24250 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b  ( (nLen + nPre +
24260 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20   17) > nBuf ){. 
24270 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24280 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41  zBuf);.    OSTRA
24290 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
242a0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
242b0 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  OR\n"));.    ret
242c0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
242d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
242e0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
242f0 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  5", 0);.  }..  s
24300 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
24310 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42  nBuf-16-nLen, zB
24320 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f  uf+nLen, SQLITE_
24330 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
24340 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65  );..  j = sqlite
24350 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
24360 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
24370 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
24380 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  j]);.  for(i=0; 
24390 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
243a0 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28  .    zBuf[j] = (
243b0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
243c0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
243d0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
243e0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a  hars)-1) ];.  }.
243f0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
24400 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
24410 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b    *pzBuf = zBuf;
24420 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ..  OSTRACE(("TE
24430 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65  MP-FILENAME name
24440 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%s, rc=SQLITE_O
24450 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20  K\n", zBuf));.  
24460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24480 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
24490 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c  med file is real
244a0 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20  ly a directory. 
244b0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
244c0 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68  .** it is someth
244d0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
244e0 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69   directory, or i
244f0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
24500 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ind of memory.**
24510 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
24520 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
24530 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
24540 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74  t void *zConvert
24550 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  ed){.  DWORD att
24560 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
24570 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
24580 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  no;..  if( osIsN
24590 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
245a0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
245b0 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
245c0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
245d0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
245e0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
245f0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
24600 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
24610 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
24620 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
24630 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
24660 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
24670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
24690 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69  AttrData)) && wi
246a0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
246b0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
246c0 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b  }.    if( !rc ){
246d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
246e0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65   /* Invalid name
246f0 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61  ? */.    }.    a
24700 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
24710 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
24720 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
24730 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
24740 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
24750 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
24760 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
24770 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
24780 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21  .  return (attr!
24790 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
247a0 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74  TRIBUTES) && (at
247b0 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
247c0 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a  E_DIRECTORY);.}.
247d0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
247e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
247f0 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c  t winOpen(.  sql
24800 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
24810 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
24820 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61  o get maximum pa
24830 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a  th name length *
24840 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24850 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
24860 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
24870 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
24880 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
24890 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
248a0 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
248b0 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
248c0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248e0 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
248f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
24900 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
24910 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
24920 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
24930 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
24940 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
24950 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
24960 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
24970 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
24980 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
24990 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
249a0 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
249b0 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
249c0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
249d0 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
249e0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
249f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
24a00 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f  inFile*)id;.  vo
24a10 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20  id *zConverted; 
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a30 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65  Filename in OS e
24a40 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  ncoding */.  con
24a50 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61  st char *zUtf8Na
24a60 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46  me = zName; /* F
24a70 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
24a80 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
24a90 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  nt cnt = 0;..  /
24aa0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
24ab0 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
24ac0 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
24ad0 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
24ae0 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
24af0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
24b00 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
24b10 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
24b20 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
24b30 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65    char *zTmpname
24b40 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d   = 0; /* For tem
24b50 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c  porary filename,
24b60 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a   if necessary. *
24b70 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  /..  int rc = SQ
24b80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
24b90 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
24ba0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23  Return Code */.#
24bb0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
24bc0 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  UG) || SQLITE_OS
24bd0 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79  _WINCE.  int eTy
24be0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
24bf0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
24c00 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
24c10 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74  */.#endif..  int
24c20 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
24c30 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24c40 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
24c50 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
24c60 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
24c70 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
24c80 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
24c90 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
24ca0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24cb0 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
24cc0 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
24cd0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24ce0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
24cf0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
24d00 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
24d10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
24d20 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65  DWRITE);..#ifnde
24d30 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
24d40 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  sOpenJournal = (
24d50 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
24d60 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
24d70 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
24d80 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20  JOURNAL.     || 
24d90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24da0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a  EN_MAIN_JOURNAL.
24db0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
24dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
24dd0 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f   ));.#endif..  O
24de0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
24df0 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c  me=%s, pFile=%p,
24e00 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46   flags=%x, pOutF
24e10 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  lags=%p\n",.    
24e20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65         zUtf8Name
24e30 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75  , id, flags, pOu
24e40 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20  tFlags));..  /* 
24e50 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
24e60 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
24e70 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  re true:.  **.  
24e80 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
24e90 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
24ea0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
24eb0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
24ec0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
24ed0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
24ee0 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
24ef0 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
24f00 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
24f10 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
24f20 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
24f30 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
24f40 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
24f50 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
24f60 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
24f70 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
24f80 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
24f90 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
24fa0 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
24fb0 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
24fc0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
24fd0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
24fe0 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
24ff0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
25000 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
25010 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
25020 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
25030 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
25040 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
25050 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
25060 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
25070 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
25080 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
25090 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  er.  ** automati
250a0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
250b0 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
250c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
250d0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
250e0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
250f0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
25100 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
25110 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
25120 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
25130 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
25140 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
25150 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
25160 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
25170 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
25180 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
25190 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
251a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
251b0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
251c0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
251d0 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
251e0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
251f0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
25200 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
25210 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
25220 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
25230 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
25240 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
25250 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
25260 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
25270 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
25280 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
25290 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
252a0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
252b0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20  _TEMP_JOURNAL.  
252c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
252d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
252e0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
252f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
25300 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  STER_JOURNAL.   
25310 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
25320 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
25330 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
25340 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
25350 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
25360 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d   pFile!=0 );.  m
25370 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
25380 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29  sizeof(winFile))
25390 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49  ;.  pFile->h = I
253a0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
253b0 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  LUE;..#if SQLITE
253c0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
253d0 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73  !zUtf8Name && !s
253e0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
253f0 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
25400 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
25410 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22  ERROR,.        "
25420 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
25430 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20  ectory variable 
25440 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f  should be set fo
25450 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23  r WinRT");.  }.#
25460 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
25470 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25480 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
25490 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e  ion is NULL, gen
254a0 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74 65 6d  erate a.  ** tem
254b0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
254c0 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 69   to use.  */.  i
254d0 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b  f( !zUtf8Name ){
254e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 44  .    assert( isD
254f0 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e  elete && !isOpen
25500 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72  Journal );.    r
25510 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  c = winGetTempna
25520 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61  me(pVfs, &zTmpna
25530 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
25540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25550 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
25560 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25  EN name=%s, rc=%
25570 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73  s", zUtf8Name, s
25580 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
25590 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
255a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
255b0 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70  zUtf8Name = zTmp
255c0 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
255d0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
255e0 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
255f0 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
25600 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
25610 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
25620 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
25630 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
25640 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
25650 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
25660 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20  _parameter()..  
25670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54  */.  assert( (eT
25680 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
25690 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c  _MAIN_DB) || (fl
256a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
256b0 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20  N_URI) ||.      
256c0 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74   zUtf8Name[sqlit
256d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38  e3Strlen30(zUtf8
256e0 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a  Name)+1]==0 );..
256f0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
25700 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65   filename to the
25710 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67   system encoding
25720 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65  . */.  zConverte
25730 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
25740 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
25750 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28  Utf8Name);.  if(
25760 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
25770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
25780 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
25790 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
257a0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
257b0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22  ITE_IOERR_NOMEM"
257c0 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20  , zUtf8Name));. 
257d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
257e0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
257f0 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69  }..  if( winIsDi
25800 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
25810 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25820 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25830 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25840 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f  zTmpname);.    O
25850 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
25860 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
25870 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22  _CANTOPEN_ISDIR"
25880 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20  , zUtf8Name));. 
25890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
258a0 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b  _CANTOPEN_ISDIR;
258b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
258c0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64  adWrite ){.    d
258d0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
258e0 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
258f0 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20  GENERIC_WRITE;. 
25900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65   }else{.    dwDe
25910 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
25920 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a  NERIC_READ;.  }.
25930 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  /* SQLITE_OPE
25940 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75  N_EXCLUSIVE is u
25950 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
25960 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65   that a new file
25970 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   is.  ** created
25980 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74  . SQLite doesn't
25990 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63   use it to indic
259a0 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61  ate "exclusive a
259b0 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73 20 69  ccess".  ** as i
259c0 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
259d0 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
259e0 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
259f0 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
25a00 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
25a10 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
25a20 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
25a30 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
25a40 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
25a50 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
25a60 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
25a70 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
25a80 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
25a90 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
25aa0 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
25ab0 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
25ac0 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
25ad0 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
25ae0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
25af0 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
25b00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25b10 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
25b20 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
25b30 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
25b40 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
25b50 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
25b60 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
25b70 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
25b80 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
25b90 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
25ba0 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
25bb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
25bc0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
25bd0 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
25be0 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
25bf0 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
25c00 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
25c10 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
25c20 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
25c30 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
25c60 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
25c70 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c90 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
25ca0 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
25cb0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
25cc0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
25cd0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
25ce0 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
25cf0 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
25d00 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
25d10 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
25d20 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
25d30 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
25d40 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
25d50 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
25d60 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
25d70 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
25d80 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
25d90 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
25da0 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
25db0 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
25dc0 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  if..  if( osIsNT
25dd0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
25de0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52  _OS_WINRT.    CR
25df0 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
25e00 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78  ED_PARAMETERS ex
25e10 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
25e20 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
25e30 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20  rameters.dwSize 
25e40 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46  = sizeof(CREATEF
25e50 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
25e60 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65  RAMETERS);.    e
25e70 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
25e80 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  s.dwFileAttribut
25e90 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  es =.           
25ea0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
25eb0 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54  butes & FILE_ATT
25ec0 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20  RIBUTE_MASK;.   
25ed0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
25ee0 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20  ers.dwFileFlags 
25ef0 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  = dwFlagsAndAttr
25f00 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c  ibutes & FILE_FL
25f10 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  AG_MASK;.    ext
25f20 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
25f30 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61  dwSecurityQosFla
25f40 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e  gs = SECURITY_AN
25f50 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74  ONYMOUS;.    ext
25f60 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
25f70 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69 62  lpSecurityAttrib
25f80 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utes = NULL;.   
25f90 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
25fa0 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c  ers.hTemplateFil
25fb0 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68  e = NULL;.    wh
25fc0 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
25fd0 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52  teFile2((LPCWSTR
25fe0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
26010 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26030 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
26040 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20  eMode,.         
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
26070 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65 6e            &exten
260a0 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d  dedParameters))=
260b0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
260c0 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20  VALUE &&.       
260d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260e0 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49         winRetryI
260f0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
26100 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
26110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
26120 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a   */.    }.#else.
26130 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
26140 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c  osCreateFileW((L
26150 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
26160 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
26190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
261c0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
261f0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26210 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
26220 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
26250 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
26260 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
26290 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
262a0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
262b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
262c0 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p */.    }.#endi
262d0 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
262e0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
262f0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77  SI.  else{.    w
26300 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
26310 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52  ateFileA((LPCSTR
26320 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
26350 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
26380 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
263b0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
263c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
263f0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26410 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
26420 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
26430 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26450 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
26460 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
26480 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
26490 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
264a0 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
264b0 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20  t, __LINE__);.. 
264c0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
264d0 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73  file=%p, name=%s
264e0 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63  , access=%lx, rc
264f0 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38  =%s\n", h, zUtf8
26500 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
26510 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
26520 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
26530 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
26540 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
26550 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
26560 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
26570 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
26580 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
26590 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
265a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
265b0 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
265c0 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
265d0 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
265e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
265f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
26600 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
26610 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
26620 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
26630 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
26640 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
26650 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
26660 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28  , id,.         (
26670 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50  (flags|SQLITE_OP
26680 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20  EN_READONLY) &. 
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266a0 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45      ~(SQLITE_OPE
266b0 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
266c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29  OPEN_READWRITE))
266d0 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46  ,.         pOutF
266e0 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lags);.    }else
266f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
26700 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
26710 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
26720 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
26730 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  ){.    if( isRea
26740 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  dWrite ){.      
26750 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
26760 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
26770 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
26780 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
26790 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
267a0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
267b0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  }..  OSTRACE(("O
267c0 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d  PEN file=%p, nam
267d0 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78  e=%s, access=%lx
267e0 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20  , pOutFlags=%p, 
267f0 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22  *pOutFlags=%d, "
26800 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d  .           "rc=
26810 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e  %s\n", h, zUtf8N
26820 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
26830 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c  cess, pOutFlags,
26840 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20   pOutFlags ?.   
26850 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61          *pOutFla
26860 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41  gs : 0, (h==INVA
26870 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
26880 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
26890 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ok"));..#if SQLI
268a0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
268b0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
268c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
268d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20  PEN_MAIN_DB.    
268e0 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63     && (rc = winc
268f0 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
26900 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49  e, pFile))!=SQLI
26910 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f  TE_OK.  ){.    o
26920 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b  sCloseHandle(h);
26930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26940 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
26950 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26960 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f  zTmpname);.    O
26970 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45  STRACE(("OPEN-CE
26980 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72  -LOCK name=%s, r
26990 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20  c=%s\n", zName, 
269a0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
269b0 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  c)));.    return
269c0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   rc;.  }.  if( i
269d0 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69  sTemp ){.    pFi
269e0 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
269f0 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b  se = zConverted;
26a00 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
26a10 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    {.    sqlite3_
26a20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
26a30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
26a40 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
26a50 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
26a60 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d = &winIoMethod
26a70 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20  ;.  pFile->pVfs 
26a80 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d  = pVfs;.  pFile-
26a90 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73  >h = h;.  if( is
26aa0 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
26ab0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
26ac0 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e   |= WINFILE_RDON
26ad0 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  LY;.  }.  if( sq
26ae0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
26af0 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  n(zName, "psow",
26b00 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
26b10 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
26b20 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
26b30 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
26b40 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  PSOW;.  }.  pFil
26b50 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
26b60 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
26b70 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
26b80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
26b90 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46  MMAP_SIZE>0.  pF
26ba0 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
26bb0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ;.  pFile->pMapR
26bc0 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69  egion = 0;.  pFi
26bd0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
26be0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
26bf0 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
26c00 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
26c10 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
26c20 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
26c30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e  ;.#endif..  Open
26c40 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
26c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26c60 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
26c70 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
26c80 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77  Note that Window
26c90 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
26ca0 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
26cb0 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
26cc0 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
26cd0 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
26ce0 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
26cf0 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
26d00 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
26d10 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
26d20 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
26d30 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
26d40 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
26d50 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
26d60 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
26d70 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
26d80 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
26d90 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
26da0 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
26db0 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
26dc0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
26dd0 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
26de0 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
26df0 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
26e00 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
26e10 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
26e20 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
26e30 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
26e40 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
26e50 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
26e60 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
26e70 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
26e80 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a   int winDelete(.
26e90 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
26ea0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs,          /*
26eb0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
26ec0 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
26ed0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *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 64 65 6c 65 74 65 20 2a 2f  ile to delete */
26f00 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20  .  int syncDir  
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f20 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
26f30 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n32 */.){.  int 
26f40 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  cnt = 0;.  int r
26f50 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  c;.  DWORD attr;
26f60 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
26f70 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  no = 0;.  void *
26f80 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
26f90 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
26fa0 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vfs);.  UNUSED_P
26fb0 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72  ARAMETER(syncDir
26fc0 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
26fd0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
26fe0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
26ff0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
27000 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73  ELETE name=%s, s
27010 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46  yncDir=%d\n", zF
27020 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72  ilename, syncDir
27030 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ));..  zConverte
27040 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
27050 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
27060 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
27070 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
27080 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
27090 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
270a0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
270b0 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e  NOMEM\n", zFilen
270c0 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ame));.    retur
270d0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
270e0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
270f0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
27100 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  do {.#if SQLITE_
27110 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57  OS_WINRT.      W
27120 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
27130 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
27140 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  ta;.      memset
27150 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
27160 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
27170 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f  ));.      if ( o
27180 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
27190 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64  esExW(zConverted
271a0 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53  , GetFileExInfoS
271b0 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271d0 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
271e0 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20  rData) ){.      
271f0 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
27200 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
27210 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tes;.      }else
27220 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
27230 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
27240 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
27250 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
27260 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
27270 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
27280 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
27290 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
272a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
272b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
272c0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
272d0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
272e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
272f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
27300 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
27310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
27320 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  reak;.      }.#e
27330 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d  lse.      attr =
27340 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
27350 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64  utesW(zConverted
27360 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
27370 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c  if ( attr==INVAL
27380 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
27390 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  ES ){.        la
273a0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
273b0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
273c0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
273d0 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
273e0 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
273f0 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
27400 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
27410 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
27420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
27430 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
27440 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
27450 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
27460 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
27470 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
27480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
274a0 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
274b0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
274c0 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
274d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
274e0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
274f0 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
27500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27510 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
27520 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76  eleteFileW(zConv
27530 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
27540 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27550 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
27560 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
27570 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
27580 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49   if ( !winRetryI
27590 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
275a0 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
275b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
275c0 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20  ROR; /* No more 
275d0 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20  retries. */.    
275e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
275f0 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31   }.    } while(1
27600 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
27610 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
27620 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
27630 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20  do {.      attr 
27640 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
27650 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65  butesA(zConverte
27660 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61  d);.      if ( a
27670 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr==INVALID_FIL
27680 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a  E_ATTRIBUTES ){.
27690 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
276a0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
276b0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
276c0 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
276d0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
276e0 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
276f0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
27700 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
27710 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27720 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
27730 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
27740 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
27750 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27760 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27770 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
27780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
27790 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
277a0 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45    if ( attr&FILE
277b0 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
277c0 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  TORY ){.        
277d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
277e0 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79  R; /* Files only
277f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
27800 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
27810 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46    if ( osDeleteF
27820 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileA(zConverted)
27830 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27840 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44   SQLITE_OK; /* D
27850 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20  eleted OK. */.  
27860 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27870 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
27880 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26  !winRetryIoerr(&
27890 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
278a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
278b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
278c0 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65  * No more retrie
278d0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  s. */.        br
278e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
278f0 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d   } while(1);.  }
27900 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
27910 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
27920 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
27930 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  T ){.    rc = wi
27940 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
27950 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c  _IOERR_DELETE, l
27960 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65  astErrno, "winDe
27970 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lete", zFilename
27980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27990 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c  winLogIoerr(cnt,
279a0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a   __LINE__);.  }.
279b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
279c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53  Converted);.  OS
279d0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e  TRACE(("DELETE n
279e0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22  ame=%s, rc=%s\n"
279f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
27a00 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
27a10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27a20 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
27a30 68 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64  he existence and
27a40 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
27a50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27a60 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
27a70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
27a80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
27a90 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
27aa0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27ab0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
27ac0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
27ad0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
27ae0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
27af0 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
27b00 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
27b10 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
27b20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
27b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27b40 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b  UT: Result */.){
27b50 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
27b60 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
27b70 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
27b80 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
27b90 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
27ba0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
27bb0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
27bc0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
27bd0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
27be0 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ; );.  OSTRACE((
27bf0 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
27c00 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f   flags=%x, pResO
27c10 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  ut=%p\n",.      
27c20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
27c30 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29  flags, pResOut))
27c40 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  ;..  zConverted 
27c50 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
27c60 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
27c70 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
27c80 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
27c90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43      OSTRACE(("AC
27ca0 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63  CESS name=%s, rc
27cb0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
27cc0 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  MEM\n", zFilenam
27cd0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
27ce0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27cf0 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  EM;.  }.  if( os
27d00 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  IsNT() ){.    in
27d10 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
27d20 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
27d30 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
27d40 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
27d50 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
27d60 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
27d70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
27d80 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
27d90 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
27da0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
27dd0 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
27de0 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
27e10 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
27e20 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
27e30 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
27e40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
27e50 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
27e60 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
27e70 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
27e80 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
27e90 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
27ea0 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
27eb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
27ec0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
27ed0 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
27ee0 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
27ef0 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
27f00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
27f10 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
27f20 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20  SizeLow==0 ){.  
27f30 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
27f40 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
27f50 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTES;.      }els
27f60 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
27f70 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
27f80 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
27f90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
27fa0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  .      winLogIoe
27fb0 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f  rr(cnt, __LINE__
27fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
27fd0 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
27fe0 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
27ff0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
28000 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
28010 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28020 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28030 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
28040 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
28060 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
28070 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20  "winAccess",.   
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
280a0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
280b0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
280c0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
280d0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
280e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
280f0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
28100 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
28110 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
28120 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
28130 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
28140 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
28150 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28160 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
28170 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
28180 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
28190 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
281a0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
281b0 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
281c0 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
281d0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
281e0 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
281f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
28200 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
28210 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
28220 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
28230 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
28240 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
28250 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
28260 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
28270 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
28280 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
28290 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
282a0 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
282b0 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
282c0 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
282d0 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
282e0 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%s, pResOut=%p,
282f0 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
28300 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
28310 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
28320 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ame, pResOut, *p
28330 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
28340 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28350 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
28360 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
28370 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
28380 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
28390 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a   drive letter.**
283a0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
283b0 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a  olon character..
283c0 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
283d0 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
283e0 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74  ndColon(.  const
283f0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
28400 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73  .){.  return ( s
28410 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
28420 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
28430 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
28440 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
28450 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
28460 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
28470 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
28480 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d  be used verbatim
28490 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  .  If.** non-zer
284a0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72  o is returned fr
284b0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
284c0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
284d0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70  nction must simp
284e0 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72  ly.** use the pr
284f0 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65  ovided path name
28500 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72   verbatim -OR- r
28510 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61  esolve it into a
28520 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a   full path name.
28530 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74  ** using the Get
28540 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e  FullPathName Win
28550 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  32 API function 
28560 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
28570 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
28580 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
28590 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
285a0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
285b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
285c0 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
285d0 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72  ts with a forwar
285e0 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63  d slash or a bac
285f0 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69  kslash, it is ei
28600 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61  ther.  ** a lega
28610 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f  l UNC name, a vo
28620 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61  lume relative pa
28630 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  th, or an absolu
28640 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20  te path name in 
28650 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20  the.  ** "Unix" 
28660 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77  format on Window
28670 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  s.  There is no 
28680 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66  easy way to diff
28690 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
286a0 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  n.  ** the final
286b0 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72   two cases; ther
286c0 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e  efore, we return
286d0 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72   the safer retur
286e0 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a  n value of TRUE.
286f0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c    ** so that cal
28700 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
28710 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c  ction will simpl
28720 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  y use it verbati
28730 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  m..  */.  if ( w
28740 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68  inIsDirSep(zPath
28750 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
28760 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
28770 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
28780 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
28790 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65  rts with a lette
287a0 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74  r and a colon it
287b0 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c   is either a vol
287c0 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ume.  ** relativ
287d0 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73  e path or an abs
287e0 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c  olute path.  Cal
287f0 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
28800 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20  ction must not. 
28810 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74   ** attempt to t
28820 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c  reat it as a rel
28830 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
28840 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c  (i.e. they shoul
28850 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a  d simply use.  *
28860 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a  * it verbatim)..
28870 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
28880 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
28890 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20  olon(zPathname) 
288a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
288b0 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
288c0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
288d0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
288e0 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
288f0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
28900 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
28910 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
28920 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
28930 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
28940 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
28950 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
28960 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
28970 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
28980 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
28990 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
289a0 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
289b0 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
289c0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
289d0 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
289e0 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
289f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
28a00 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
28a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
28a20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
28a30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
28a40 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
28a50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
28a60 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
28a70 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
28a80 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
28a90 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
28aa0 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
28ab0 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ad0 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
28ae0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
28af0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
28b20 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64  fer */.){..#if d
28b30 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
28b40 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
28b50 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
28b60 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
28b70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28b80 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74  nFull);.  assert
28b90 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d  ( nFull>=pVfs->m
28ba0 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69  xPathname );.  i
28bb0 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
28bc0 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
28bd0 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
28be0 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
28bf0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
28c00 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
28c10 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
28c20 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
28c30 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
28c40 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
28c50 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
28c60 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
28c70 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
28c80 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
28c90 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
28ca0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
28cb0 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
28cc0 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
28cd0 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
28ce0 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
28cf0 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73  ctory and a slas
28d00 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  h..    */.    ch
28d10 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
28d20 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
28d30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
28d40 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
28d50 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
28d60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
28d70 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
28d80 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
28d90 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
28da0 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43    (osIsNT() ? CC
28db0 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
28dc0 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
28dd0 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20  WIN_A) |.       
28de0 20 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56       CCP_RELATIV
28df0 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f  E, zRelative, zO
28e00 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ut, pVfs->mxPath
28e10 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20  name+1)<0 ){.   
28e20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28e30 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74  zOut);.      ret
28e40 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28e50 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
28e60 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
28e70 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
28ea0 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
28eb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28ec0 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
28ed0 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
28ee0 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a  Filename(zOut);.
28ef0 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38        if( !zUtf8
28f00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28f10 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
28f20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28f30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
28f40 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
28f50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28f60 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
28f70 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
28f80 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
28f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28fb0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
28fc0 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
28fd0 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
28fe0 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
28ff0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29000 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
29010 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
29020 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
29030 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
29040 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
29050 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
29060 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
29070 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
29080 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
29090 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
290a0 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
290b0 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20      (osIsNT() ? 
290c0 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
290d0 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
290e0 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20  O_WIN_A),.      
290f0 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c        zRelative,
29100 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50   zOut, pVfs->mxP
29110 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a  athname+1)<0 ){.
29120 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29130 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
29140 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
29150 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
29160 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  EN_CONVPATH, (DW
29170 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
291a0 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76  name2", zRelativ
291b0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
291c0 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
291d0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
291e0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74  tf8Filename(zOut
291f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55  );.      if( !zU
29200 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tf8 ){.        s
29210 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
29220 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
29230 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
29240 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
29250 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29260 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
29270 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
29280 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
29290 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
292a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
292b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
292c0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
292d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
292e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
292f0 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f  f..#if (SQLITE_O
29300 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
29310 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21  E_OS_WINRT) && !
29320 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
29330 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
29340 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
29350 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
29360 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
29370 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
29380 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
29390 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
293a0 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68   */.  /* WinRT h
293b0 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e  as no way to con
293c0 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20  vert a relative 
293d0 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c  path to an absol
293e0 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66  ute one. */.  if
293f0 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
29400 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
29410 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
29420 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
29430 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
29440 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
29450 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
29460 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
29470 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
29480 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
29490 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
294a0 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
294b0 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
294c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
294d0 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
294e0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
294f0 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
29500 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
29510 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
29520 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
29530 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
29540 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
29550 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
29560 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
29570 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
29580 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
29590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
295a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
295b0 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
295c0 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52  nGetDirSep(), zR
295d0 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73  elative);.  }els
295e0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
295f0 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
29600 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
29610 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
29620 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
29630 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
29640 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
29650 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
29660 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
29670 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
29680 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
29690 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20    DWORD nByte;. 
296a0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
296b0 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
296c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
296d0 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ath name begins 
296e0 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72  with "/X:", wher
296f0 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70  e "X" is any alp
29700 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61  habetic.  ** cha
29710 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20  racter, discard 
29720 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20  the initial "/" 
29730 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d  from the pathnam
29740 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  e..  */.  if( zR
29750 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
29760 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  && winIsDriveLet
29770 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c  terAndColon(zRel
29780 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20  ative+1) ){.    
29790 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d  zRelative++;.  }
297a0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
297b0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
297c0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
297d0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
297e0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
297f0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
29800 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
29810 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
29820 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
29830 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
29840 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
29850 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
29860 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
29870 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
29880 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
29890 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
298a0 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
298b0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
298c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
298d0 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74   );.  if ( sqlit
298e0 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
298f0 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
29900 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
29910 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
29920 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
29930 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
29940 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
29950 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
29960 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
29970 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
29980 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
29990 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
299a0 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
299b0 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
299c0 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
299d0 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
299e0 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
299f0 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
29a00 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
29a10 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
29a20 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20   a backslash..  
29a30 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
29a40 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
29a50 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
29a60 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
29a70 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%c%s",.       
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
29a90 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
29aa0 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53  tory, winGetDirS
29ab0 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29  ep(), zRelative)
29ac0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
29ad0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43  ITE_OK;.  }.  zC
29ae0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
29af0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
29b00 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
29b10 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
29b20 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
29b30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
29b40 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
29b50 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
29b60 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a    LPWSTR zTemp;.
29b70 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
29b80 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
29b90 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
29ba0 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ed, 0, 0, 0);.  
29bb0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
29bc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29bd0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29be0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
29bf0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
29c00 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
29c10 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
29c20 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
29c50 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
29c60 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
29c70 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20  += 3;.    zTemp 
29c80 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
29c90 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
29ca0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
29cb0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
29cc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29cd0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29ce0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
29d00 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  EM;.    }.    nB
29d10 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
29d20 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
29d30 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  R)zConverted, nB
29d40 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
29d50 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
29d60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29d70 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29d80 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
29d90 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
29da0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
29db0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
29dc0 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
29dd0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
29de0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
29e00 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c  nFullPathname2",
29e10 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
29e20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
29e30 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29e40 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55  .    zOut = winU
29e50 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
29e60 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
29e70 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
29e80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
29e90 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
29ea0 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
29eb0 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
29ec0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
29ed0 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
29ee0 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
29ef0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
29f00 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
29f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
29f20 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
29f30 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
29f40 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
29f50 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
29f60 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
29f90 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74  thname3", zRelat
29fa0 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
29fb0 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20  nByte += 3;.    
29fc0 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d  zTemp = sqlite3M
29fd0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
29fe0 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
29ff0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
2a000 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
2a010 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2a020 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2a030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2a040 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
2a050 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2a060 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
2a070 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
2a080 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
2a090 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2a0a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2a0b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2a0c0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
2a0d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
2a0e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a0f0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2a100 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2a110 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2a120 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a140 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2a150 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e4", zRelative);
2a160 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a170 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2a180 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
2a190 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
2a1a0 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
2a1b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2a1c0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
2a1d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75  #endif.  if( zOu
2a1e0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a1f0 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
2a200 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
2a210 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
2a220 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
2a230 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
2a240 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
2a250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2a260 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
2a270 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2a280 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
2a290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a2a0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2a2b0 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
2a2c0 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
2a2d0 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
2a2e0 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
2a2f0 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
2a300 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2a310 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
2a320 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2a330 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2a340 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
2a350 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2a360 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2a370 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
2a380 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65  LE h;.#if define
2a390 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2a3a0 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73  int nFull = pVfs
2a3b0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2a3c0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
2a3d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2a3e0 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f  o( nFull );.  vo
2a3f0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
2a400 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d   0;.  if( zFull=
2a410 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2a420 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
2a430 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
2a440 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
2a450 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
2a460 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2a470 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2a480 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2a490 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21  , nFull, zFull)!
2a4a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a4b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a4c0 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41  Full);.    OSTRA
2a4d0 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2a4e0 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2a4f0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2a500 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2a510 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43  turn 0;.  }.  zC
2a520 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
2a530 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
2a540 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  ename(zFull);.  
2a550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
2a560 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69  ll);.#else.  voi
2a570 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
2a580 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2a590 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
2a5a0 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
2a5b0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2a5c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43  .#endif.  if( zC
2a5d0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
2a5e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2a5f0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2a600 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2a610 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2a620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2a630 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
2a640 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
2a650 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
2a660 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
2a670 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
2a680 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
2a690 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
2a6a0 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
2a6b0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
2a6c0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
2a6d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
2a6e0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
2a6f0 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
2a700 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
2a710 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
2a720 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
2a730 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2a740 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2a750 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2a760 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c  void*)h));.  sql
2a770 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2a780 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
2a790 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
2a7a0 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
2a7b0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2a7c0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2a7d0 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
2a7e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a7f0 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47  ER(pVfs);.  winG
2a800 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
2a810 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2a820 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
2a830 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
2a840 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
2a850 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
2a860 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
2a870 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2a880 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20   FARPROC proc;. 
2a890 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a8a0 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20  R(pVfs);.  proc 
2a8b0 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  = osGetProcAddre
2a8c0 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20  ssA((HANDLE)pH, 
2a8d0 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45  zSym);.  OSTRACE
2a8e0 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d  (("DLSYM handle=
2a8f0 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61  %p, symbol=%s, a
2a900 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20  ddress=%p\n",.  
2a910 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
2a920 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a  pH, zSym, (void*
2a930 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72  )proc));.  retur
2a940 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
2a950 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20  )proc;.}.static 
2a960 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
2a970 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2a980 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
2a990 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2a9a0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
2a9b0 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
2a9c0 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20  NDLE)pHandle);. 
2a9d0 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f   OSTRACE(("DLCLO
2a9e0 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  SE handle=%p\n",
2a9f0 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29   (void*)pHandle)
2aa00 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2aa10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2aa20 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2aa30 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2aa40 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
2aa50 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2aa60 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2aa70 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
2aa80 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
2aa90 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  lose 0.#endif...
2aaa0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
2aab0 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
2aac0 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
2aad0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
2aae0 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
2aaf0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
2ab00 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2ab10 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
2ab20 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  t n = 0;.  UNUSE
2ab30 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2ab40 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
2ab50 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
2ab60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2ab70 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20  IT_RANDOMNESS). 
2ab80 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
2ab90 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
2aba0 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
2abb0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
2abc0 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
2abd0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
2abe0 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
2abf0 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
2ac00 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
2ac10 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
2ac20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
2ac30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
2ac40 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
2ac50 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
2ac60 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
2ac70 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
2ac80 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
2ac90 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
2aca0 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
2acb0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
2acc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2acd0 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f  INRT.  if( sizeo
2ace0 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42  f(ULONGLONG)<=nB
2acf0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e  uf-n ){.    ULON
2ad00 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65  GLONG cnt = osGe
2ad10 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a  tTickCount64();.
2ad20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
2ad30 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
2ad40 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
2ad50 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
2ad60 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73   }.#else.  if( s
2ad70 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
2ad80 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
2ad90 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  D cnt = osGetTic
2ada0 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65  kCount();.    me
2adb0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
2adc0 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
2add0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
2ade0 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  of(cnt);.  }.#en
2adf0 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  dif.  if( sizeof
2ae00 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
2ae10 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
2ae20 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
2ae30 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f      osQueryPerfo
2ae40 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
2ae50 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
2ae60 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
2ae70 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
2ae80 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
2ae90 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2aea0 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
2aeb0 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
2aec0 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49  TE_WIN32_USE_UUI
2aed0 44 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55  D.  if( sizeof(U
2aee0 55 49 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  UID)<=nBuf-n ){.
2aef0 20 20 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20      UUID id;.   
2af00 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20   memset(&id, 0, 
2af10 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20  sizeof(UUID));. 
2af20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74 65 28     osUuidCreate(
2af30 26 69 64 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  &id);.    memcpy
2af40 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 64 2c 20  (&zBuf[n], &id, 
2af50 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20  sizeof(UUID));. 
2af60 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 55     n += sizeof(U
2af70 55 49 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  UID);.  }.  if( 
2af80 73 69 7a 65 6f 66 28 55 55 49 44 29 3c 3d 6e 42  sizeof(UUID)<=nB
2af90 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 55 49 44  uf-n ){.    UUID
2afa0 20 69 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   id;.    memset(
2afb0 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55  &id, 0, sizeof(U
2afc0 55 49 44 29 29 3b 0a 20 20 20 20 6f 73 55 75 69  UID));.    osUui
2afd0 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61  dCreateSequentia
2afe0 6c 28 26 69 64 29 3b 0a 20 20 20 20 6d 65 6d 63  l(&id);.    memc
2aff0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 64  py(&zBuf[n], &id
2b000 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2b010 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
2b020 28 55 55 49 44 29 3b 0a 20 20 7d 0a 23 65 6e 64  (UUID);.  }.#end
2b030 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  if.#endif /* def
2b040 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2b050 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2b060 49 54 45 5f 5a 45 52 4f 5f 50 52 4e 47 5f 53 45  ITE_ZERO_PRNG_SE
2b070 45 44 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ED) */.  return 
2b080 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  n;.}.../*.** Sle
2b090 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
2b0a0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
2b0b0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
2b0c0 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  e slept..*/.stat
2b0d0 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28  ic int winSleep(
2b0e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2b0f0 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29  s, int microsec)
2b100 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  {.  sqlite3_win3
2b110 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65  2_sleep((microse
2b120 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
2b130 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b140 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
2b150 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
2b160 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
2b170 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2b180 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
2b190 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
2b1a0 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
2b1b0 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
2b1c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
2b1d0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
2b1e0 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
2b1f0 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
2b200 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
2b210 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
2b220 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
2b230 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2b240 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
2b250 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
2b260 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
2b270 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
2b280 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
2b290 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
2b2a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2b2b0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
2b2c0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
2b2d0 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
2b2e0 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
2b2f0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2b300 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2b310 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
2b320 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
2b330 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
2b340 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
2b350 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
2b360 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
2b370 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
2b380 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
2b390 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
2b3a0 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
2b3b0 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
2b3c0 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
2b3d0 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
2b3e0 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
2b3f0 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
2b400 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
2b410 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2b420 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
2b430 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  date.** cannot b
2b440 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2b450 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
2b460 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
2b470 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
2b480 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
2b490 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
2b4a0 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
2b4b0 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
2b4c0 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
2b4d0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31  number of.     1
2b4e0 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
2b4f0 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
2b500 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
2b510 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a   JD 2305813.5)..
2b520 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20    */.  FILETIME 
2b530 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ft;.  static con
2b540 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
2b550 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
2b560 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71  h = 23058135*(sq
2b570 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
2b580 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  000;.#ifdef SQLI
2b590 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
2b5a0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b5b0 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
2b5c0 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
2b5d0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2b5e0 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e  ;.#endif.  /* 2^
2b5f0 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73  32 - to avoid us
2b600 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e  e of LL and warn
2b610 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20  ings in gcc */. 
2b620 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2b630 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33  lite3_int64 max3
2b640 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20  2BitValue =.    
2b650 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
2b660 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
2b670 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
2b680 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20  0000000 +.      
2b690 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2b6a0 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53  94967296;..#if S
2b6b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
2b6c0 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65   SYSTEMTIME time
2b6d0 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ;.  osGetSystemT
2b6e0 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
2b6f0 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
2b700 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
2b710 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
2b720 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53  o. */.  if (!osS
2b730 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2b740 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b  ime(&time,&ft)){
2b750 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b760 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
2b770 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
2b780 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
2b790 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a   &ft );.#endif..
2b7a0 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69    *piNow = winFi
2b7b0 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20  letimeEpoch +.  
2b7c0 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71            ((((sq
2b7d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
2b7e0 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d  wHighDateTime)*m
2b7f0 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a  ax32BitValue) +.
2b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b810 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
2b820 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
2b830 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31  (sqlite3_int64)1
2b840 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51  0000;..#ifdef SQ
2b850 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
2b860 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2b870 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
2b880 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
2b890 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
2b8a0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
2b8b0 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
2b8c0 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
2b8d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2b8e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b8f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  OK;.}../*.** Fin
2b900 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2b910 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2b920 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2b930 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
2b940 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
2b950 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2b960 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
2b970 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
2b980 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
2b990 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
2b9a0 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
2b9b0 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
2b9c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
2b9d0 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
2b9e0 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
2b9f0 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e  le *prNow){.  in
2ba00 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
2ba10 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20  int64 i;.  rc = 
2ba20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2ba30 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20  t64(pVfs, &i);. 
2ba40 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
2ba50 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
2ba60 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74  000.0;.  }.  ret
2ba70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ba80 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
2ba90 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
2baa0 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d  works like a com
2bab0 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47  bination of.** G
2bac0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e  etLastError() an
2bad0 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28  d FormatMessage(
2bae0 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72  ) on Windows (or
2baf0 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74   errno and.** st
2bb00 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e  rerror_r() on Un
2bb10 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72  ix). After an er
2bb20 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
2bb30 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63  by an OS.** func
2bb40 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c  tion, SQLite cal
2bb50 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
2bb60 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74   with zBuf point
2bb70 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66  ing to.** a buff
2bb80 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73  er of nBuf bytes
2bb90 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73  . The OS layer s
2bba0 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74  hould populate t
2bbb0 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74  he.** buffer wit
2bbc0 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  h a nul-terminat
2bbd0 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  ed UTF-8 encoded
2bbe0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
2bbf0 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  * describing the
2bc00 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74   last IO error t
2bc10 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  o have occurred 
2bc20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69  within the calli
2bc30 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a  ng.** thread..**
2bc40 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72  .** If the error
2bc50 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   message is too 
2bc60 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75  large for the su
2bc70 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a  pplied buffer,.*
2bc80 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74  * it should be t
2bc90 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65  runcated. The re
2bca0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47  turn value of xG
2bcb0 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69  etLastError.** i
2bcc0 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
2bcd0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
2bce0 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
2bcf0 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
2bd00 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
2bd10 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
2bd20 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d  ncated). If non-
2bd30 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
2bd40 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
2bd50 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
2bd60 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
2bd70 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72  -terminator char
2bd80 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20  acter.** in the 
2bd90 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a  output buffer..*
2bda0 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69  *.** Not supplyi
2bdb0 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
2bdc0 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f  age will have no
2bdd0 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a   adverse effect.
2bde0 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74  ** on SQLite. It
2bdf0 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65   is fine to have
2be00 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
2be10 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a  on that never.**
2be20 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
2be30 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  r message:.**.**
2be40 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45     int xGetLastE
2be50 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2be60 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2be70 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a  , char *zBuf){.*
2be80 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75  *     assert(zBu
2be90 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20  f[0]=='\0');.** 
2bea0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a      return 0;.**
2beb0 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76     }.**.** Howev
2bec0 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d  er if an error m
2bed0 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69  essage is suppli
2bee0 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69  ed, it will be i
2bef0 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62  ncorporated.** b
2bf00 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68  y sqlite into th
2bf10 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2bf20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
2bf30 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73   user using.** s
2bf40 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c  qlite3_errmsg(),
2bf50 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67   possibly making
2bf60 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65   IO errors easie
2bf70 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73  r to debug..*/.s
2bf80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
2bf90 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
2bfa0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2bfb0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2bfc0 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
2bfd0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2bfe0 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 73  return winGetLas
2bff0 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
2c000 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
2c010 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zBuf);.}../*.*
2c020 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
2c030 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
2c040 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
2c050 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
2c060 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2c070 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
2c080 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2c090 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
2c0a0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2c0b0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
2c0c0 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
2c0d0 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
2c0e0 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
2c0f0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
2c100 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
2c110 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
2c120 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2c130 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
2c140 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
2c150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2c160 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c180 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
2c190 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
2c1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
2c1b0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
2c1c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
2c1d0 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
2c1e0 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
2c1f0 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2c200 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2c210 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
2c220 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
2c230 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
2c240 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
2c250 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
2c260 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
2c270 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
2c280 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
2c290 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
2c2a0 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
2c2b0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
2c2c0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
2c2d0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
2c2e0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
2c2f0 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
2c300 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
2c310 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
2c320 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2c330 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
2c340 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2c350 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2c360 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
2c370 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
2c380 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
2c390 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
2c3a0 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
2c3b0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2c3c0 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
2c3d0 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
2c3e0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
2c3f0 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xGetSystemCall
2c400 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53   */.    winNextS
2c410 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20  ystemCall,   /* 
2c420 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
2c430 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69  */.  };.#if defi
2c440 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2c450 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61  _HAS_WIDE).  sta
2c460 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
2c470 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d  winLongPathVfs =
2c480 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
2c490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
2c4a0 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
2c4b0 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
2c4c0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
2c4d0 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
2c4e0 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
2c4f0 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
2c500 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c520 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
2c530 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20  in32-longpath", 
2c540 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
2c550 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2c560 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2c570 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2c580 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2c590 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2c5a0 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2c5b0 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
2c5c0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
2c5d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2c5e0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2c5f0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2c600 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
2c610 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
2c620 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2c630 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2c640 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2c650 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
2c660 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
2c670 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
2c680 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
2c690 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
2c6a0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2c6b0 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2c6c0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
2c6d0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2c6e0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2c6f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
2c700 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
2c710 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
2c720 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
2c730 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
2c740 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
2c750 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
2c760 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2c770 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
2c780 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2c790 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2c7a0 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
2c7b0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2c7c0 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
2c7d0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
2c7e0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2c7f0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
2c800 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
2c810 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2c820 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62  endif..  /* Doub
2c830 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
2c840 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
2c850 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
2c860 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
2c870 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
2c880 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
2c890 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
2c8a0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
2c8b0 53 79 73 63 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a  Syscall)==80 );.
2c8c0 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
2c8d0 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
2c8e0 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
2c8f0 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
2c900 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
2c910 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
2c920 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2c930 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
2c940 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
2c950 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
2c960 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
2c970 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
2c980 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
2c990 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
2c9a0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
2c9b0 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
2c9c0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
2c9d0 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
2c9e0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
2c9f0 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
2ca00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2ca10 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2ca20 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76  IDE).  sqlite3_v
2ca30 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
2ca40 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b  LongPathVfs, 0);
2ca50 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2ca60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ca70 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
2ca80 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51  nd(void){.#if SQ
2ca90 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2caa0 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55  if( sleepObj!=NU
2cab0 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  LL ){.    osClos
2cac0 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a  eHandle(sleepObj
2cad0 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  );.    sleepObj 
2cae0 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64  = NULL;.  }.#end
2caf0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
2cb00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
2cb10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
2cb20 4e 20 2a 2f 0a                                   N */.